Skip to main content
Glama

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

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_mcp

DAWG_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-mcp

Codex

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

DAWG_API_KEY

yes

—

Your DAWG API key

DAWG_BASE_URL

no

https://dawgswarm.ru

Platform base URL

DAWG_PROVISION_TIMEOUT

no

120

Max seconds to wait for a browser to be ready

DAWG_POLL_INTERVAL

no

2

Seconds between readiness polls

DAWG_DEFAULT_NAV_TIMEOUT_MS

no

30000

Default navigation timeout

DAWG_DEFAULT_ACTION_TIMEOUT_MS

no

15000

Default action timeout

DAWG_SNAPSHOT_MAX_CHARS

no

60000

Truncate snapshot/content output

DAWG_MAX_SESSIONS

no

4

Max concurrent browsers

DAWG_LOG_LEVEL

no

INFO

Log level (logs go to stderr)

Tools

Browser — lifecycle

Tool

Description

browser_provision(proxy?, geo?)

Provision a remote stealth Chromium. geo = city slug ("moskva") or "lat,lon". Returns session_id + initial snapshot.

browser_release(session_id?)

Release a browser back to the pool.

browser_list_sessions()

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

browser_navigate(url, timeout_ms?)

Go to a URL.

browser_navigate_back() / browser_navigate_forward()

History navigation.

browser_snapshot()

See the page — ARIA tree with [ref=eN] markers.

browser_click(element, ref, double?, button?)

Click an element by ref.

browser_type(element, ref, text, submit?, clear?)

Type into a field by ref.

browser_fill_form(fields)

Fill many fields at once ([{element, ref, value}]).

browser_select_option(element, ref, values)

Choose <select> option(s).

browser_hover(element, ref)

Hover an element.

browser_press_key(key)

Press a key ("Enter", "Control+a", …).

browser_wait_for(text?, text_gone?, time_ms?)

Wait for text / its disappearance / a delay.

browser_get_text(format?, selector?)

Get page text or HTML.

browser_take_screenshot(full_page?, ref?)

PNG image (visual verification only).

browser_evaluate(function, ref?)

Run JS, return JSON result.

browser_tabs(action, index?, url?)

list / new / select / close tabs.

Scraper

Tool

Description

scrape_page(url, format?, main_content?, include_links?, render?, timeout_ms?)

Scrape one URL → content.

scrape_crawl(url, max_depth?, max_pages?, …)

Start a crawl job → job_id.

scrape_batch(urls, concurrency?, …)

Start a batch job → job_id.

scrape_job_status(job_id, wait?, wait_timeout?)

Poll a crawl/batch job.

scrape_cancel_job(job_id)

Cancel a job.

Account

Tool

Description

account_usage()

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-mcp

License

MIT — see LICENSE.

Available Tools

24 tools
account_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_navigateC

Navigate the active page to a URL. Returns a fresh AI snapshot.

Inputs: url (required), session_id, timeout_ms.

browser_navigate_backC

Go back in history. Returns a fresh AI snapshot.

Inputs: session_id.

browser_navigate_forwardB

Go forward in history. Returns a fresh AI snapshot.

Inputs: session_id.

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

    A3.5/5.0

    Scored across 24 tools

    Disambiguation5/5

    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.

    Naming Consistency5/5

    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.

    Tool Count4/5

    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.

    Completeness4/5

    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

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers