bathys
This server is a local MCP research toolkit that runs web metasearch, reads pages (including JS-heavy ones), and returns distilled, budgeted markdown — all without cloud API quotas.
deep_research: one-call pipeline combining search + reading top sources + distillation into a focused answer.
web_search: runs SearXNG metasearch with automatic retries on empty/blocked results; supports language/country hints, cache refresh, and pure JSON output.
read_url: fetches a single page, strips boilerplate, renders JS via headless browser when needed, and returns clean markdown (optionally focused by a query under a character budget).
read_urls: batch-read 1–10 known URLs in parallel under one shared character budget; duplicate URLs are merged and failures reported as a single line.
Caching: raw page text is stored in SQLite, so re-reading a page with a different query is instant and offline.
Local & quota-free: replaces N+1 cloud search/read calls with one local invocation; no cloud quotas.
Resilience: empty or blocked search results trigger automatic retries with alternate engine sets; failed pages in batch mode cost one line, not a failed call.
Model-friendly output: consistent markdown outputs, optional
as_jsonfor machine-readable search results.
Uses SearXNG as the search backend to perform web searches and collect raw results, which are then distilled into concise, query-relevant answers.
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., "@bathysDeep research: compare SQLite WAL vs PostgreSQL for 2026"
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.
Bathys
Единый локальный поисковый сервис глубокого ресёрча для ИИ-агентов. Это самостоятельный продукт, а не обёртка над чужими сервисами: Bathys реализует весь конвейер сам — метапоиск с дедупликацией и живучестью к блокировкам, двухъярусное извлечение (HTTP-движок по умолчанию, headless-браузер только для JS-страниц), пятистадийную дистилляцию под запрос с жёсткими бюджетами, TTL-кэш сырца, robots-этику, метрики и диагностику. Метапоиск и извлечение оформлены как сменные внутренние движки (SearXNG, Crawl4AI) — их можно заменить, продукт останется Bathys. Облачных квот нет; LLM внутри нет — синтез остаётся за вызывающим агентом, дистилляция детерминированная (BM25).
Сонар находит координаты, батискаф ныряет за полными текстами, дистиллятор поднимает на палубу только то, что отвечает на вопрос.
Навигация: ⚡ Quick start · 🧹 Удаление · 🔌 Подключение · 🧠 Научить агента · 🧭 Кейсы · 🛠 Инструменты · 📊 Экономия токенов · 📚 Документация · 📍 Статус
⚡ Quick start
Вариант 1 — установочный скрипт (рекомендуется; Python ≥ 3.10):
curl -fsSL https://raw.githubusercontent.com/Korrnals/bathys/main/install.sh | bashСкрипт ставит пакет с PyPI в приватный venv (~/.local/share/bathys/venv, без sudo), добавляет его в PATH и запускает полную настройку. Повторный запуск — безопасное обновление.
Вариант 2 — pip (то же самое вручную):
pip install bathys
bathys setupЧто делает bathys setup:
Шаг | Действие |
1 | ставит headless-браузер — нужен только для JS-страниц (обычные страницы читает встроенный HTTP-движок) |
2 | прописывает MCP-сервер во все найденные харнессы (zcode, Claude, Cursor, VS Code-семейство и другие — всего 14, см. Подключение) |
3 | копирует субагента-ресёрчера в каталоги найденных харнессов |
4 | печатает итог и подсказки ( |
SearXNG устанавливать отдельно не нужно — бэкенд поднимается автоматически при первом поиске: сначала проверяется внешний инстанс, затем docker/podman, затем нативный режим (клон в BATHYS_SEARXNG_HOME).
npm (Node-first окружения; обёртка ставит Python-пакет сама):
npm install -g bathys-mcp
bathys-mcp setupИз исходников (разработка):
git clone https://github.com/Korrnals/bathys.git && cd bathys
python3.12 -m venv .venv && .venv/bin/pip install -e .
.venv/bin/bathys setupОткат на конкретную версию — переменная установочного скрипта:
BATHYS_INSTALL_VERSION=0.7.0 bash install.shМинимальный образ без ensurepip: скрипт и setup сами бутстрапят pip через get-pip.py — подробности в docs/getting-started/install.md.
🧹 Удаление
bathys uninstall # снять Bathys со всех харнессов
bathys uninstall hermes zcode # точечно, только указанные
bathys uninstall --purge # + удалить venv, кэш и данныеuninstall удаляет только записи bathys из конфигов харнессов (перед изменением создаётся бэкап *.bathys-backup-*; чужие серверы и субагенты не затрагиваются). --purge дополнительно удаляет каталоги ~/.local/share/bathys и ~/.cache/bathys; строку bathys/venv/bin из .profile/.bashrc удалите вручную. Подробности и восстановление из бэкапа — в runbook.
Related MCP server: myscrape
🔌 Подключение к харнессу
Автоматически — весь стек: bathys setup (см. выше) прописывает сервер во все найденные харнессы.
Точечно — когда нужно именно здесь:
bathys install # автодетект всех установленных харнессов
bathys install hermes # только Hermes (отсутствующий конфиг создастся)
bathys install --list # все поддерживаемые таргеты с путями
bathys install --print-config # готовые блоки для ручной вставкиДетектируются zcode, Claude Code, Claude Desktop, Cursor, VS Code-семейство (Cline / Roo Code / Kilo Code), Gemini CLI, Windsurf, Zed, opencode, goose, Hermes; форматы каждого — свои (JSON-схемы и YAML-контуры goose/hermes), запись идемпотентна с бэкапом. Для Pi (badlogic pi-mono), у которого нет MCP-конфига, — дроп-ин в AGENTS.md. Кастомные интеграции — в каталоге integrations/.
Bathys — stdio MCP-сервер: блок mcpServers один и тот же везде, от харнесса зависит только файл, в который его кладут. command — абсолютный путь к бинарнику (~ внутри JSON не раскрывается); BATHYS_SEARXNG_HOME опциональна. Готовые блоки под каждый клиент: bathys install --print-config.
{
"mcpServers": {
"bathys": {
"command": "/path/to/bathys",
"env": { "BATHYS_SEARXNG_HOME": "/path/to/searxng-home" }
}
}
}Харнесс | Гайд |
zcode | |
Claude Code / Claude Desktop | |
Cursor | |
Любой другой MCP-клиент |
🧠 Научить агента работать эффективно
Конфиг — только половина дела. Из коробки харнесс получает instructions-playbook (матрицу выбора инструментов), annotations и три стратегии-промпта — bathys_deep_research, bathys_source_audit, bathys_fresh_scan, — так что выбирает инструменты Bathys уже нативно. Сильнее — профиль: субагент agents/bathys-researcher.md с двумя скиллами, которому глубокий ресёрч делегируется целиком; для клиентов, не показывающих MCP instructions, — дроп-ин agents/HARNESS-DROPIN.md в AGENTS.md / CLAUDE.md / .cursor/rules.
Пошаговая инструкция «из коробки → субагент → дроп-ин» и таблица сигналов футеров — в «Живых кейсах», раздел C.
🧭 Ходовые кейсы
Сравнение технологий. На вопрос «что выбрать под нагрузку в 2026?» агент делает один deep_research, доуточняет запрос терминами из найденного и верифицирует вывод по двум источникам: один вызов вместо цепочки «поиск + N чтений», в контекст попадает 7.5k символов вместо ~35k.
[bathys: 34 raw hits, top 8 considered · dove 3 pages · 35669 ch fetched → 7508 ch returned · 1.3s]Аудит спорного утверждения. «Правда ли, что в X упали замеры?» — агент берёт стратегию bathys_source_audit: пакетно читает ссылки из обсуждения, ищет опровержения и выносит вердикт по каждому тезису с URL. Битая ссылка стоит одну строку, а не сорванный вызов.
Свежий срез. «Что нового в Y за две недели?» — стратегия bathys_fresh_scan: поиск с time_range=week, пакетное чтение, сводка с датами; протухший cache HIT лечится одним refresh=true.
Полный разбор всех кейсов — пользовательских, автономных агентов и эксплуатации — с живыми диалогами: docs/getting-started/cases.md.
🛠 Инструменты
Инструмент | Что делает |
| ищет, параллельно читает топ-источники, возвращает слитый дистиллят под запрос. Первый вызов для любого ресёрч-вопроса. |
| ранжированный список ссылок со сниппетами без содержимого страниц; |
| читает страницу (включая текстовые PDF); с |
| пакетно читает до 10 известных страниц; бюджет делится между успешными, сбой страницы — одна строка, не сорванный вызов. |
Поиск сужается общими фильтрами time_range, category, engines, language. Живой футер ответа показывает сжатие и кэш: [bathys: 41 raw hits, top 3 considered · dove 3 pages · 35669 ch fetched → 7508 ch returned · 3.2s].
📊 Экономия токенов
Шкала честная и символьная, токены ≈ chars/4; каждая цифра взята из футера реального вызова.
Вызов | Из сети | Агенту | Сжатие |
| 37 549 симв. | 1 986 симв. | 18.9× |
| 17 063 симв. | 2 325 симв. | 7.3× |
| 35 669 симв. | 7 508 симв. | 4.7× |
Двухъярусное извлечение — обычные страницы читает собственный HTTP-движок (миллисекунды, без браузера), JS-оболочки — headless-Chromium; дальше дистилляция под запрос с жёсткими бюджетами символов.
Кэш сырца до дистилляции — SQLite хранит сырой текст, поэтому перечитать страницу под другим углом можно бесплатно и без сети.
Ноль облачных квот —
deep_researchзаменяет цепочку «поиск + N чтений», то есть N+1 списаний квоты, одним локальным вызовом.
Методика и пороги — в docs/operations/metrics.md.
📚 Документация
Раздел | Что внутри | Кому |
Хаб: дерево документации и три маршрута чтения | всем — точка входа | |
Установка · конфигурация (20 env) · подключение · живые кейсы | новичку | |
Обзор подключения · zcode · Claude Code · Cursor · любой MCP-клиент | при подключении харнесса | |
контрибьютору | ||
интегратору | ||
эксплуатация | ||
Хартия · функции · роадмап · конкуренты | владельцу продукта | |
Шесть принятых архитектурных решений | контрибьютору | |
авторам доков |
Вне docs/: agents/ — субагент, скиллы, дроп-ин · integrations/ — кастомные интеграции (hermes, pi, zcode) · install.sh — установочный скрипт · npm/bathys-mcp/ — NPM-обёртка · tests/ — юнит-тесты · CHANGELOG.md — история выпусков.
📍 Статус
0.9.0. Выпускная история: v0.2 «Качество выдачи» (ретраи, здоровье движков), v0.3 «Паритет с Tavily» (read_urls, JSON-режим), v0.4 «Эксплуатация» (robots-этика, метрики, bathys-doctor), v0.5 «Identity & Harness» (репозиционирование, промпты, субагент), v0.6 «Native Install» (bathys install), v0.7 «Ship & Setup» (двухъярусное извлечение, bathys setup, однострочник, uninstall) — итоги в CHANGELOG.md.
Репозиторий: github.com/Korrnals/bathys. Пакет опубликован: PyPI bathys (pip install), однострочник установки — выше. До 1.0: публикация npm-обёртки bathys-mcp и первый прогон Docker-образа; CI (matrix 3.10–3.12 + shellcheck) уже в репозитории.
🙏 Благодарности
Bathys стоит на плечах выдающихся открытых проектов — спасибо их авторам и сообществам:
SearXNG — движок метапоиска (AGPL-3.0): Bathys запускает его как отдельный процесс и говорит с ним по локальному JSON API; исходники не модифицируются и не распространяются внутри пакета.
Crawl4AI — браузерный ярус извлечения (Apache-2.0).
MCP Python SDK (MIT), httpx (BSD-3), Playwright (Apache-2.0).
Полные атрибуции и условия использования каждого компонента — в THIRD_PARTY_NOTICES.md.
⚖️ Лицензия
Код Bathys — MIT. Компоненты, которые Bathys устанавливает и использует, лицензированы отдельно и перечислены в THIRD_PARTY_NOTICES.md (в частности, SearXNG — под AGPL-3.0, с соблюдением её условий).
Available Tools
4 toolsdeep_researchARead-only
Search the web AND read the top sources in one shot.
Runs SearXNG metasearch, dives into the top max_sources pages with a real
browser, distills each page down to passages relevant to query, and
returns one merged digest. Best first call for any research question.
Args:
query: research question or keywords (RU/EN both fine)
max_sources: how many top hits to read in full (1-6)
max_results: how many search hits to consider (1-20)
per_source_chars: per-source character budget (300-8000)
time_range: "day" | "week" | "month" | "year"
category: searxng category, e.g. "general", "news", "science", "it"
language: result language, e.g. "ru", "en", "ru-RU"
refresh: ignore cache and re-fetch search results and pages
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| refresh | No | ||
| category | No | ||
| language | No | ||
| time_range | No | ||
| max_results | No | ||
| max_sources | No | ||
| per_source_chars | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description is transparent about the internal process: it runs SearXNG metasearch, opens pages with a real browser, distills relevant passages, and returns a merged digest. It also explains the refresh parameter's cache behavior, and the readOnlyHint annotation matches the read-only nature of the tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a headline summary followed by a compact parameter list. It conveys substantial detail without unnecessary fluff, keeping every sentence purposeful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a fairly complex tool, the description covers the search engine, browser-based reading, per-source distillation, merged output, and cache refresh behavior. This is sufficient for an agent to understand what the tool does and what to expect as a result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though the schema has no per-parameter descriptions, the tool description compensates by explaining every parameter: query, max_sources, max_results, per_source_chars, time_range, category, language, and refresh. It includes value ranges and concrete examples, which is more informative than the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a crisp verb-resource statement: 'Search the web AND read the top sources in one shot.' It clearly differentiates this combined tool from the individual sibling tools by emphasizing the one-shot search-and-read workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Best first call for any research question,' giving a strong and direct recommendation for when to use the tool. This makes the usage context clear without needing to infer from sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_urlARead-only
Read one web page; return its main content as clean, budgeted markdown.
JS-rendered pages are handled by a real headless browser. Boilerplate
(nav, footer, ads) is stripped; if query is given, only passages relevant
to it are returned. Pages are cached — re-reads with a different query are
instant and cost no network.
Args:
url: absolute http(s) URL
query: optional focus; return only passages relevant to it
max_chars: output character budget (300-50000)
refresh: ignore cache and re-fetch the page
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| query | No | ||
| refresh | No | ||
| max_chars | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses caching, refresh behavior, JS rendering, and boilerplate stripping, which go beyond the readOnly annotation. It does not mention network costs or rate limits, but the primary side effects are covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured, with each feature stated in one clear sentence. No redundant information or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema and annotations, the description covers the main behavioral aspects an agent needs: content extraction, caching, and refresh. It could be slightly more explicit about edge cases, but overall it is complete enough for typical use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has good parameter names and defaults, but the description adds only minimal explanation for query and refresh. It does not clarify the exact format of max_chars or how refresh interacts with cache, leaving some semantics implicit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads one web page and returns main content as markdown. It distinguishes from siblings like web_search and deep_research, though read_urls is a close sibling that isn't explicitly contrasted.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains general behavior (JS rendering, boilerplate stripping, caching) and the query parameter's effect, which implies when it might be used. However, it does not explicitly state when to prefer this tool over read_urls or web_search.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_urlsARead-only
Read several known web pages in one call under one shared character budget.
Pages are fetched in parallel (JS-rendered, boilerplate-stripped) and the combined total_chars budget is split evenly between the pages that came back. Prefer this over N read_url calls when you already hold the URLs: one round-trip, one budget, and a failed page costs one line instead of a failed call. Args: urls: 1-10 absolute http(s) URLs; duplicates (after utm/fragment cleanup) are merged, extras beyond 10 are reported in a Skipped line query: optional focus; each page is distilled to passages relevant to it total_chars: combined output budget across all sections (300-30000) refresh: ignore cache and re-fetch every page
| Name | Required | Description | Default |
|---|---|---|---|
| urls | Yes | ||
| query | No | ||
| refresh | No | ||
| total_chars | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation readOnlyHint is consistent with the read operation, and the description adds useful behavioral details: parallel fetching, JS rendering, boilerplate stripping, even budget splitting, duplicate merging, and skipped extras. Failure behavior is also disclosed as a failed page costing one line rather than a failed call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficient and well structured, with the high-level behavior, use case, and parameter details each getting their own section. There is minor repetition of ideas such as 'one call' and 'one round-trip', but nothing that significantly hurts clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for an agent to select and invoke the tool correctly: it covers purpose, use case, parameter semantics, failure behavior, and important operational details. The presence of an output schema and readOnly/openWorld annotations reduces the need for additional output or side-effect explanation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema itself lacks property descriptions, the tool description fully compensates by explaining each parameter: urls constraints and deduplication, query as optional focus, total_chars as the combined budget, and refresh as cache bypass. This goes well beyond the bare schema and gives an agent everything needed to set parameters correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states precisely what the tool does: reads several known web pages in one call under a shared character budget. This clearly distinguishes it from sibling tools like read_url, web_search, and deep_research by emphasizing the batch and known-URL aspects.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly recommends this tool over repeated read_url calls when the URLs are already known, and gives concrete reasons: one round-trip, one budget, and partial failure handling. This gives an agent clear, actionable selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_searchARead-only
Search the web via SearXNG metasearch; return a compact ranked link list.
Returns title, URL and a short snippet per hit — no page content. Empty or blocked results are retried automatically with other engine sets. To actually read pages, call read_url; to do both at once, call deep_research. Args: query: search query (natural language or keywords) max_results: 1-20 time_range: "day" | "week" | "month" | "year" category: e.g. "general", "news", "science", "it", "files" engines: comma-separated engine names, e.g. "google,bing,duckduckgo" language: e.g. "ru", "en", "ru-RU" refresh: ignore cache and re-run the search as_json: return pure machine-readable JSON {query, count, hits[], answer?} instead of the human-friendly list (no footer line)
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| as_json | No | ||
| engines | No | ||
| refresh | No | ||
| category | No | ||
| language | No | ||
| time_range | No | ||
| max_results | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that results are compact, that page content is not returned, and that empty/blocked results are retried automatically. The readOnlyHint annotation covers side effects; no contradictory claims are present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with a short overview, behavior note, and per-parameter list. There is slight redundancy between 'compact ranked link list' and 'Returns title, URL and a short snippet per hit,' but overall it is efficient and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool, the description covers the main use case, output format, retry behavior, and key parameters. It does not explain the human-friendly list format in detail, but the schema and sibling-tool references provide enough context for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema itself has no parameter descriptions, but the Args section adds concise semantics for every parameter, including examples for category, engines, language, and time_range. It also clarifies the as_json return shape with the JSON placeholder.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Search the web via SearXNG metasearch') and explicitly identifies the output shape ('compact ranked link list'). It also distinguishes itself from siblings by name and behavior, making selection clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly tells the agent when to use this tool versus alternatives: 'To actually read pages, call read_url; to do both at once, call deep_research.' This removes ambiguity about whether the tool returns page content.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
v0.5.0- First observed
deep_research - First observed
read_url - First observed
read_urls - First observed
web_search
TDQS
Scored across 4 tools
Each tool has a clearly distinct role: web_search returns links only, read_url reads a single page, read_urls batches page reads, and deep_research combines search and reading. The descriptions explicitly cross-reference each other, eliminating ambiguity between the overlapping search/read behaviors.
read_url and read_urls follow a verb_noun pattern, but deep_research and web_search are noun-style phrases rather than commands. The naming is readable and all tools use lowercase with underscores, but the verb/noun mix is inconsistent.
Four tools form a tight, purposeful set for a web research server: search, read single, read batch, and search+read combined. There is no bloat, and each tool earns its place.
The domain of web research is fully covered: discover URLs, fetch one page, fetch many pages, and run a combined research workflow. No critical lifecycle step is missing, and the tools compose naturally.
Maintenance
Related MCP Connectors
Scrape, crawl and search the web for AI agents via MCP.
AI Reasoning Cache & Consensus Layer with 11 MCP tools via Streamable HTTP.
Agent-native search engine with live web research optimized for AI agents.
Live AI-native web search with citations. One tool for every MCP client. Flat per-request pricing.
Related MCP Servers
- AlicenseAqualityAmaintenanceProvides local-first web intelligence over MCP with tools for search, fetch, crawl, extract, cache, find-similar, research, and autonomous agent loops, requiring no API keys.10790 npm5,227AGPL 3.0
- AlicenseNot gradedqualityAmaintenanceA self-contained web-research MCP server that lets local LLM agents search, fetch, and synthesize web content using tools like web_search, web_fetch, and web_research.1MIT
- AlicenseNot gradedqualityBmaintenanceMCP server enabling local-first web search, fetch, extract, and caching with citeable excerpts, no API key required. Supports research workflows for agents and apps.16 npmMIT
- FlicenseAqualityBmaintenanceExposes web search and page fetching tools via the MCP protocol, allowing integration with AI editors like Cursor for autonomous research workflows.2-