DonSeTch — веб-инструменты для AI-агентов: загрузка страниц, поиск и краулинг без API-ключей
📂 Исходный код на GitHubВеб-инструменты для AI-агентов, написанные с нуля на Rust: загрузка страниц, поиск без ключей, краулинг и скриншоты. Один бинарник, MCP-сервер и CLI, без API-ключей и аккаунтов. Лицензия AGPL v3.
DonSeTch — это набор веб-инструментов для AI-агентов: загрузка страниц, поиск по интернету, обход сайтов и скриншоты. Всё собрано в один бинарник на Rust и работает на вашей машине. API-ключи не нужны, аккаунты тоже. Проект называет себя «вебом для AI-агентов» и подключается как MCP-сервер (Claude Code, Cursor, OpenCode, Pi, Hermes) или работает как обычный CLI.
Транспорт написан с нуля: без hyper, без Playwright, без Selenium. По замыслу автора, это даёт одновременно скорость и невидимость для антиботов, а набор инструментов остаётся маленьким. Схема всех четырёх инструментов занимает 2369 токенов. Проект распространяется по лицензии AGPL v3, в репозитории больше 1300 тестов.
Установка и подключение
npm install -g donsetch
Также есть установка через Homebrew (brew tap dondai44423/donsetch && brew install donsetch), нативное расширение для агента Pi (pi install npm:donsetch) и плагин для DeepSeek Harness. npm-пакет скачивает готовый бинарник с GitHub Releases и проверяет его по SHA256.
Подключение к любому MCP-клиенту — один блок конфигурации:
{
"mcpServers": {
"donsetch": {
"command": "donsetch",
"args": ["mcp", "--supervised"]
}
}
}
Флаг --supervised запускает надзирающий демон: если процесс упадёт, он перезапустится, а сессия продолжит работать. Вместо глобальной установки можно указать "command": "npx", "args": ["donsetch", "mcp"]. Есть и HTTP-транспорт: donsetch mcp --http --port 8765.
Проверить установку:
donsetch doctor # проверки конфигурации, поиска, TLS, браузера, DNS
donsetch doctor --fix # починить то, что чинится автоматически
Четыре инструмента
| Инструмент | Что делает |
|---|---|
web_fetch |
Превращает любой URL в чистый Markdown. Сначала обычный HTTP, при защитной стене — переход в headless-браузер. PDF с OCR, выбор секций, действия на странице. |
web_search |
Поиск без ключей: больше 10 бэкендов параллельно, общий консенсус и локальный семантический переранжировщик. На выходе — ссылки и фрагменты, а не выкачанная статья. |
web_crawl |
Обход сайтов в пределах одного домена по схеме «sitemap + очередь страниц», с приоритизацией по теме и честными причинами остановки. |
web_screenshot |
Скриншот страницы в PNG через тот же браузерный уровень. |
Каждая ошибка отдаётся структурированно: код (wall.challenge, guard.ssrf, deadline.hit), тип (permanent, transient, walled) и строка next_action. Агент ветвится по коду, а не разбирает текст ошибки.
Поиск без API-ключей
Без ключей работают шесть поисковых систем из четырёх независимых индексов плюс восемь отраслевых источников: семья Bing (Bing, DuckDuckGo, Yahoo), Brave, Mojeek, Google, а также GitHub, Wikipedia, Hacker News, Semantic Scholar, arXiv, StackExchange, MDN и Google News. Запросы уходят ко всем движкам параллельно, потом результаты сливаются, дедуплицируются и ранжируются.
Три вещи делают качество:
- Консенсус. Ссылку, которую вернули несколько независимых индексов, поднимают в выдаче. У каждого результата видны оценка, число независимых источников и список движков.
- Семантический переранжировщик. Локальная ONNX-модель (
ms-marco-MiniLM-L-6-v2, 23 МБ) читает запрос, заголовок и фрагмент и пересчитывает порядок. Смешивается с консенсусом и BM25 в пропорции 60/40. - Честность. Флаг
weak=trueговорит, что согласие движков низкое. Статус каждого движка виден, фейковых «результатов нет» не бывает.
Ключевые показатели из репозитория: на 110 вопросах в 11 тематиках без единого ключа найденный ответ был в фрагменте выдачи в 95,5% случаев (для сравнения опубликованный результат Tavily — 93,3%, оценка проводилась LLM).
Платные провайдеры подключаются по желанию и никогда не обязательны: donsetch keys add tavily ..., exa, serper, serpapi, bravesearch, Bright Data и другие. Если провайдер упал или исчерпал кредиты, происходит автоматический откат на поиск без ключей. Любой другой сервис можно подключить своим плагином — обычной программой, которая по stdin получает запрос JSON и по stdout отдаёт результаты, на любом языке.
Как проект обходит защиту
- Настоящий TLS Chrome. DonSeTch управляет BoringSSL из Chrome напрямую, поэтому его ClientHello совпадает с настоящим — вплоть до порядка расширений и алгоритмов подписи. Подделывать здесь нечего: отпечаток рождается из настоящего движка, а не из таблицы заготовленных значений, которая со временем протухает.
- Временная скрытность. Возобновление TLS-сессий, повторная проверка по 304, постоянные куки, пул соединений, TCP Fast Open. Эти признаки выдают ботов сильнее самих байтов.
- «Реши и отскочи» (solve-and-bounce). Браузер почти никогда не грузит сам контент. Он решает защитную задачу и возвращает куки первому уровню — обычному HTTP, который дальше качает страницу на полной скорости.
- Самообучение. Срок жизни куки подстраивается под наблюдения. Стена, которая дважды обыграла настоящий браузер, уходит в паузу с растущей задержкой — вместо того чтобы жечь по 20–40 секунд на каждую попытку.
Интерактивные капчи (hCaptcha, reCAPTCHA, Turnstile) локально не решаются — это честная ошибка, а не зависание. Решить их может ключ третьего уровня (Bright Data Web Unlocker), настройка описана в документации. Без ключа DonSeTch работает полностью.
Экономия контекста
Главная боль агентов — это не скорость, а токены. DonSeTch режет страницу до нужного:
focus— только релевантные к запросу фрагменты с заголовками;toc+section— сначала оглавление (~170 токенов), потом одна нужная секция (~840 токенов);must_contain— проверить утверждение по всей странице и получить MATCH/NO-MATCH с тремя цитатами (~70 токенов вместо 4000);since_last— перепроверка страницы сворачивается в одну строку (~30 токенов);- ссылки по умолчанию вырезаются — примерно 30% экономии.
Типичная лестница чтения: поиск → оглавление → нужная секция. Обрезанный вывод продолжается по next_offset, остановленный краулинг — по resume.
Краулинг, PDF и локальные правила
Краулер работает в трёх режимах: full (карта и содержимое), map (только список URL) и content (обход от стартовой страницы). Есть учёт robots.txt и rate-limit'ов, уважение Retry-After, токены возобновления на 30 минут и честные причины остановки (FrontierEmpty, MaxPages, CharBudget, Deadline).
PDF разбирается своим парсером поверх PDFium, без Python-подпроцессов. Глифы и пиксели берутся из одного потока, поэтому таблицы определяются по отрисованной сетке, а текст — по символам. Сканы уходят в OCR (каскад PP-OCR), формы AcroForm превращаются в тройки «имя/тип/значение». На корпусе из 40 документов — ноль мусора на выходе и в 6–14 раз быстрее Python-аналогов.
Локальные правила в donsetch.toml запрещают конкретный сайт или закрепляют за ним уровень до первого запроса: [rules.url."example.org"] с action = "deny" и своим сообщением, которое агент читает как инструкцию. Подробнее — в документации по правилам.
Честные ограничения
Автор прямо перечисляет, чего инструмент не умеет:
- интерактивные капчи без ключа не решаются;
- поиск без ключей ходит с вашего IP, поэтому при больших объёмах нужен прокси (
donsetch proxy add ...); - OCR и переранжировщик не входят в сборку по умолчанию — их нужно собирать флагами
ocr,rerank, а при первом запуске модели качаются (~24 МБ и ~37 МБ); - проект сделан для быстрых разовых исследований — поиск, одна-две загрузки, страница документации, один PDF. Массовый сбор документов с защищённого сайта подряд — это уже другой сценарий, и там высок риск получить блокировку IP.
CLI дублирует те же движки: donsetch fetch <url>, donsetch search <query>, donsetch crawl <url>, donsetch screenshot <url>, плюс doctor, status, keys, proxy, login, update. Сравнение с Hound, Crawl4AI, Jina Reader и Firecrawl в репозитории сводится к одной строке: сочетание настоящего TLS Chrome, поиска без ключей, PDF-слития пикселей и локальной работы в одном бинарнике есть только у DonSeTch.
Источник: https://github.com/dondai44423/donsetch