DonSeTch

Local web fetch, keyless multi-engine search, site crawl and screenshots in one Rust binary

By Bishesh Bhandari (individual) Rust Local · stdio Browser automationWeb search

72 popularity score ★ 975 ↓ 1.7k/wk

Connect your client

Local (npm)

Add in one click

Opens the app, which asks before it adds the server.

Or add it by command or config

Claude CodeTerminal
claude mcp add donsetch -- npx -y donsetch mcp
Claude Desktopclaude_desktop_config.json
{
  "mcpServers": {
    "donsetch": {
      "command": "npx",
      "args": [
        "-y",
        "donsetch",
        "mcp"
      ]
    }
  }
}
Cursor~/.cursor/mcp.json
{
  "mcpServers": {
    "donsetch": {
      "command": "npx",
      "args": [
        "-y",
        "donsetch",
        "mcp"
      ]
    }
  }
}
VS Code.vscode/mcp.json
{
  "servers": {
    "donsetch": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "donsetch",
        "mcp"
      ]
    }
  }
}
Codex~/.codex/config.toml
[mcp_servers.donsetch]
command = "npx"
args = ["-y", "donsetch", "mcp"]
Gemini CLITerminal
gemini mcp add --scope user donsetch npx -- -y donsetch mcp
Local (from source)

Add in one click

Opens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.

Or add it by command or config

FirstTerminal
git clone https://github.com/dondai44423/donsetch.git
cd donsetch
cargo build --release --features ocr,rerank,http
Claude CodeTerminal
claude mcp add donsetch -- '<ABSOLUTE_PATH_TO_CLONE>/target/release/donsetch' mcp --supervised
Claude Desktopclaude_desktop_config.json
{
  "mcpServers": {
    "donsetch": {
      "command": "<ABSOLUTE_PATH_TO_CLONE>/target/release/donsetch",
      "args": [
        "mcp",
        "--supervised"
      ]
    }
  }
}
Cursor~/.cursor/mcp.json
{
  "mcpServers": {
    "donsetch": {
      "command": "<ABSOLUTE_PATH_TO_CLONE>/target/release/donsetch",
      "args": [
        "mcp",
        "--supervised"
      ]
    }
  }
}
VS Code.vscode/mcp.json
{
  "servers": {
    "donsetch": {
      "type": "stdio",
      "command": "<ABSOLUTE_PATH_TO_CLONE>/target/release/donsetch",
      "args": [
        "mcp",
        "--supervised"
      ]
    }
  }
}
Codex~/.codex/config.toml
[mcp_servers.donsetch]
command = "<ABSOLUTE_PATH_TO_CLONE>/target/release/donsetch"
args = ["mcp", "--supervised"]
Gemini CLITerminal
gemini mcp add --scope user donsetch '<ABSOLUTE_PATH_TO_CLONE>/target/release/donsetch' -- mcp --supervised

Settings 7

Set together: proxy
DONSEEK_PROXIES Optional: Comma-separated proxy pool used by search and crawl.
Set together: browser
DONSETCH_BROWSER_BACKEND Optional: Browser backend: auto, chromium, headless or cloak (cloakbrowser). Also settable as DONSETCH_BROWSER__BACKEND. Default auto.
DONSETCH_CLOAK_AUTO_DOWNLOAD Optional: Set to 1 to let it download a pinned CloakBrowser from GitHub on first use of the cloak backend. DONSETCH_BROWSER__CLOAK_AUTO_DOWNLOAD=true does the same. Default false.
CLOAKBROWSER_BINARY_PATH Optional: Path to an existing CloakBrowser binary for the cloak backend (does not select it on its own).
DONSETCH_CONFIG Optional: Path to a donsetch.toml config file.
DONSETCH_BINARY Optional: Path to an existing donsetch binary for the npm wrapper to use.
DONSETCH_HTTP_TOKEN secret Optional: Token clients must send when running the HTTP transport. For donsetch mcp --http.

What it does

DonSeTch is a single Rust program that gives an assistant four web tools: read a URL as markdown, search the public web, crawl one site, and capture a page as a PNG. It runs on your own machine over stdio, and the npm package is a thin wrapper that downloads a prebuilt binary for your platform from GitHub Releases and checks its SHA-256.

Fetching starts with plain HTTP through its own HTTP/2 stack on Chrome's BoringSSL, so the TLS handshake matches real Chrome. When a page turns out to be a bot wall or an empty JavaScript shell, it escalates to a local browser, lets that clear the challenge, then hands the cookies back to the fast HTTP path. Reads can be trimmed with a focus query, one section, a CSS selector or a phrase check. PDFs are parsed locally, and scanned ones go through OCR in the builds that include it. Search queries several engines and verticals at once with no API key, then merges and reranks the results with a small local model.

The browser used for escalation is selectable. Besides Chromium and a forced headless mode there is a CloakBrowser backend, and if you switch it on together with its auto-download setting the program fetches a pinned CloakBrowser release from GitHub the first time it needs it. In the v4.10.2 config code the backend setting defaults to `auto` and auto-download defaults to off (source: src/config.rs).

The tool list at v4.10.2 has exactly four entries, pinned by a test fixture. Some defaults there are not in the README: `web_search` returns 7 candidates by default and at most 12, while `web_crawl` reads 10 pages by default (cap 200), follows links 2 levels deep, stays on the seed host, obeys robots.txt and gives up after 120 seconds unless told otherwise (source: tests/fixtures/tools_list.json). The binary doubles as a CLI and can serve MCP over HTTP. Its README says a major V5 release is being worked on, so settings and tools may change.

What it needs

RuntimeNode.js
Runs onmacOS, Windows, Linux
Also
  • Chromium, Playwright's Chromium or Edge for browser escalation, actions and screenshots

Node.js with npm to use the npm package (it fetches a prebuilt binary). Prebuilt binaries cover Linux x64/arm64 (glibc 2.35 or newer, e.g. Ubuntu 22.04+), macOS arm64/x64 and Windows x64. musl/Alpine must build from source (Rust, Go, NASM, CMake, Clang). Windows needs tar (built in since Windows 10 1803). Network access is needed, and first OCR or rerank use downloads about 60 MB of models.

Limits

  • Not covered Interactive captchas (hCaptcha, reCAPTCHA, Turnstile) are not solved locally. They need a paid Bright Data unlocker key, otherwise the fetch returns an error.
  • Rate limit Keyless search queries engines from your own IP and gets rate-limited under heavy use unless DONSEEK_PROXIES sets a proxy pool.
  • Not covered Meant for one-shot research. Its makers warn that long or bulk sessions against a defended site can get your network's IP blocked.
  • Limit web_fetch does not check robots.txt. web_crawl obeys it by default (respect_robots).
  • Platform OCR and reranking are missing from linux-arm64 prebuilts and the default source build. On macOS they need 13.4 or newer.
  • Size cap Browser actions are capped at 16 steps, and a batch fetch takes up to 12 URLs.
  • Early release The README announces a major V5 change in progress, so tools and settings may change in the next major release.
  • Limit The README's npx example omits -y. The snippet here adds it.

Interactive captchas (hCaptcha, reCAPTCHA, Turnstile) are not solved locally; they need a paid Bright Data Web Unlocker key, otherwise the fetch returns an error. Keyless search hits engines from your own IP and gets rate-limited under heavy use unless a proxy pool is set. Its makers say it is meant for one-shot research, not long or bulk sessions against a defended site, which risk an IP-level block of your network. `web_fetch` does not check robots.txt (crawl does by default). OCR and reranking are missing from linux-arm64 prebuilts and the default source build. Browser `actions` are capped at 16 steps. The README's npx example omits `-y`; the snippet here adds it.

Who it suits

Suits a developer who wants an assistant to search and read the web from their own machine with no account or API key, including pages behind simple bot walls, PDFs and docs sites, with tight control over how many tokens a read costs. It is local only, so it needs a supported OS and ideally a Chromium install. Pick something else for long, page-by-page work on one defended site or bulk downloads: its makers point to their Bladebro browser tool for that. Teams that cannot accept AGPL-3.0 code, or that want a hosted endpoint, should look elsewhere.

Tools 4

3 only read, 1 changes things. A ? marks an optional parameter.

web_fetch changes
Read one URL or a batch as markdown, escalating to a browser on bot walls. Supports focus, sections, PDFs and in-page actionsurl: anymode?: enummax_chars?: integerfocus?: stringtoc?: booleansection?: stringselector?: stringmust_contain?: stringoffset?: integertier?: enumactions?: arraybudget_tokens?: integerdeadline_ms?: integerimage_text?: booleanlinks?: booleanmedia?: booleanshot?: stringsince_last?: booleanstitch?: boolean
web_search
Search several public engines at once without keys and return ranked URLs with snippetsquery: stringmax_results?: integerintent?: enumquery_variants?: arraydeadline_ms?: integer
web_crawl
Crawl pages of one site within page, depth, character and time budgets, or return just its URL mapurl?: stringresume?: stringmode?: enumfocus?: stringmax_pages?: integermax_depth?: integermax_total_chars?: integerper_page_max?: integermap_limit?: integerinclude_paths?: arrayexclude_paths?: arraysame_host?: booleanrespect_robots?: booleandeadline_s?: integerdataset?: booleansince_last?: boolean
web_screenshot
Render a URL in the local browser and return it as a PNG imageurl: stringfull_page?: booleanwait_ms?: integerdeadline_ms?: integer

Similar servers