Local Web Search MCP Server
Local Web Search MCP Server
Офлайн-ориентированный MCP-сервер для веб-поиска и получения контента. Он не требует внешних API-ключей и использует локальные модели для классификации намерений, опционального кросс-языкового поиска, семантического реранжирования и извлекающих ответов глубокого поиска.
Возможности
Пулинг контекстов браузера с постоянным экземпляром Playwright.
Веб-поиск через настраиваемых провайдеров с отслеживанием работоспособности и упорядоченным фолбэком.
Опциональный федеративный поиск по всем настроенным провайдерам с нормализацией URL, дедупликацией между провайдерами и слиянием по методу Reciprocal Rank Fusion (RRF).
Опциональная маршрутизация поиска с учётом намерений: консервативные эвристики, локальный классификатор как запасной вариант и версионированные профили провайдеров.
Поиск по домену для целевых запросов по сайтам.
Получение страниц через HTTP в первую очередь с быстрыми путями GitHub Raw и RSS, плюс фолбэк на Playwright для отрендеренных страниц.
Защита от SSRF для
fetch_contentпутём блокировки localhost и целей в частных сетях.Ограничение скорости по алгоритму токен-бакета для инструментов поиска и получения.
Семантический кэш на основе SQLite и
sqlite-vec.Опциональное кросс-языковое расширение запросов с локальными моделями Transformers.js.
Чистое извлечение Markdown через Readability, JSDOM и Turndown.
Related MCP server: searxng-mcp
Требования
Node.js 20.9.0 или новее.
npm.
Сетевой доступ при установке для npm-пакетов, Playwright Chromium и первой загрузки моделей.
Установка
npm install
npm run buildСкрипт postinstall загружает Playwright Chromium. При первом использовании функций на основе моделей Transformers.js загружает необходимые файлы моделей в локальный кэш Hugging Face. Первый запрос, загружающий модель, может быть медленным; последующие запросы используют локальный кэш. Оставьте ENABLE_CROSSLINGUAL=false для максимально лёгкого первого запуска. Очевидные намерения strategy=auto распознаются эвристиками без загрузки классификатора намерений; неоднозначные auto-запросы могут вызвать первую загрузку классификатора.
Конфигурация MCP-клиента
Добавьте собранный сервер в конфигурацию вашего MCP-клиента:
{
"mcpServers": {
"websearch": {
"command": "node",
"args": ["path/to/local-websearch-mcp/build/index.js"],
"env": {
"RATE_LIMIT_SEARCH_PER_MIN": "10",
"RATE_LIMIT_FETCH_PER_MIN": "20",
"SEARCH_PROVIDERS": "duckduckgo,bing",
"ENABLE_CROSSLINGUAL": "false",
"CACHE_DB_PATH": "websearch_cache.db"
}
}
}
}Если пакет установлен глобально или через package runner, используйте бинарную точку входа:
{
"mcpServers": {
"websearch": {
"command": "local-websearch-mcp",
"args": [],
"env": {
"SEARCH_PROVIDERS": "duckduckgo,bing",
"ENABLE_CROSSLINGUAL": "false"
}
}
}
}Для клиентов на основе package-runner команда может быть npx с args, установленными в ["-y", "local-websearch-mcp"], как только пакет станет доступен из настроенного npm-реестра.
Инструменты
Инструмент | Описание |
| Выполняет поиск в интернете и возвращает ранжированные результаты. Используйте |
| Получает URL и возвращает чистый Markdown с кэшированием контента, обработкой кодировки, быстрыми путями GitHub Raw, извлечением RSS-лент и фолбэком на Playwright. |
| Возвращает доступность провайдеров, статистику кэша, состояние браузера, метаданные профиля маршрутизации, флаги функций и время работы. |
Стратегии поиска
Стратегия | Поведение | Семантический кэш запросов |
| Пробует настроенных провайдеров по порядку и останавливается на первом пригодном наборе результатов. | Включён |
| Запрашивает всех доступных настроенных провайдеров параллельно, дедуплицирует URL и объединяет ранжирования с помощью RRF. | Пропускается |
| Определяет намерение, строит план маршрутизации на основе профиля | Пропускается |
auto намеренно реализован как опция; если не указывать strategy, по-прежнему используется fallback для обратной совместимости. Семантический кэш запросов пропускается для aggregate и auto, потому что ключи кэша запросов ещё не разделены по пространствам имён согласно стратегии выполнения/плану провайдеров. Контент страниц глубокого поиска по-прежнему использует обычный кэш контента.
SEARCH_PROVIDERS — это разрешительный список, а также набор настроенных провайдеров. Автомаршрутизация никогда не активирует провайдера, отсутствующего в SEARCH_PROVIDERS; профиль маршрутизации изменяет только порядок и количество настроенных провайдеров, выбираемых в качестве основных кандидатов.
Для авто-профилей с агрегацией вторичные настроенные провайдеры запрашиваются только в том случае, если все выбранные основные провайдеры не вернули пригодного результата. Частичный успех основных провайдеров принимается вместо расширения запроса только ради увеличения числа результатов. Это ограничивает нагрузку на скрейпинг и снижает излишнее воздействие блокировок/CAPTCHA.
Текущий профиль маршрутизации: v1.
Намерение | Исполнение | Предпочтительный порядок | Основная цель |
| aggregate | brave, google, bing, duckduckgo | 2 |
| aggregate | brave, google, bing, duckduckgo | 3 |
| aggregate | google, bing, brave, duckduckgo | 3 |
| aggregate | brave, google, bing, duckduckgo | 3 |
| aggregate | google, bing, duckduckgo, brave | 2 |
| aggregate | google, bing, duckduckgo, brave | 2 |
| fallback | google, bing, duckduckgo, brave | все настроенные |
| fallback | существующий настроенный порядок | все настроенные |
Эти предпочтения провайдеров являются исходными гипотезами, а не постоянными утверждениями о качестве. Они версионируются, чтобы будущие релизы могли настраивать их на основе детерминированных и реальных оценочных данных, не разбрасывая условные переходы маршрутизации по серверу.
Пример аргументов поиска с учётом намерения:
{
"query": "PostgreSQL connection pooling best practices",
"strategy": "auto",
"max_results": 5
}Используйте domain для целевых поисков, например react.dev или github.com. Определение намерения всегда получает исходный запрос; site:<domain> добавляется только после, для выполнения провайдером.
{
"query": "server components reference",
"domain": "react.dev",
"strategy": "auto",
"max_results": 5
}Используйте deep=true только тогда, когда клиенту нужно, чтобы сервер загрузил топ-страницы и извлёк вероятный ответ из текста страницы. LLM MCP-клиента по-прежнему отвечает за финальные рассуждения и обобщение.
Поисковые сниппеты с обнаруженными старыми датами содержат краткое предупреждение о свежести, чтобы клиенты могли осторожно обращаться с устаревшими источниками.
Пример аргументов федеративного поиска:
{
"query": "postgres connection pooling strategies",
"strategy": "aggregate",
"max_results": 5
}fetch_content использует быстрые пути для конкретных источников перед открытием браузера:
URL репозиториев GitHub, а также blob, tree и raw читаются с
raw.githubusercontent.com, когда это возможно.URL RSS- или Atom-лент, а также типичные пути блогов/новостных лент преобразуются в список последних элементов в Markdown.
Обычные HTML-страницы по-прежнему используют парсинг Readability через HTTP в первую очередь с фолбэком на Playwright.
Конфигурация
Переменная | По умолчанию | Описание |
|
| Максимальное количество запросов |
|
| Максимальное количество запросов |
|
| Разделённый запятыми разрешительный список/порядок провайдеров. Поддерживаемые значения: |
|
| Включает определение языка и поддержку кросс-языкового поиска. Это может вызвать первую загрузку локальных моделей. Когда отключено, эвристики запросов по-прежнему определяют поддерживаемые локали, например турецкий. |
|
| Стратегия ожидания Playwright. Используйте |
| не задано | Установите |
|
| Путь к базе данных SQLite кэша. |
|
| Интервал очистки истёкшего кэша контента. |
Docker
npm run docker:build
npm run docker:upDocker Compose хранит кэш SQLite в именованном томе, смонтированном в /app/data, а модели Hugging Face — в отдельном именованном томе. Контейнер задаёт CACHE_DB_PATH=/app/data/websearch_cache.db.
Разработка
npm run build
npm run typecheck
npm test
npm run smoke:mcp
npm audit --audit-level=moderate
npm pack --dry-run --jsonnpm run smoke:mcp запускает скомпилированный сервер через stdio, проверяет три значения стратегии web_search (fallback, aggregate, auto), проверяет диагностику маршрутизации из server_status и подтверждает, что fetch_content блокирует localhost. Он не выполняет живой поиск у провайдера, что сохраняет независимость CI от HTML/сетевой доступности поисковых систем.
Детерминированные TR/EN-фикстуры маршрутизации находятся в evals/search-routing/queries.jsonl и проверяются обычным набором тестов Vitest. Они проверяют покрытие намерений, консервативное поведение эвристик, случаи откладывания неоднозначных запросов и соблюдение разрешительного списка провайдеров без загрузки реального классификатора или обращения к провайдерам.
Устранение неполадок
Если после установки запуск не удается, выполните
npx playwright install chromium.Если первый запрос с использованием модели выполняется медленно, дождитесь завершения загрузки модели Transformers.js и повторите попытку.
Если поиск не возвращает результатов, измените порядок/набор
SEARCH_PROVIDERSили попробуйте прямой URLfetch_content.Если режим aggregate слишком медленный или вызывает блокировку провайдера, используйте стратегию
fallbackпо умолчанию.Если
autoвыбирает слишком широкий план поиска для вашего сценария, используйте явныеfallbackилиaggregate; явные стратегии обходят автоматический планировщик.Если Docker не может найти Chromium, пересоберите образ с помощью
npm run docker:build.Если файлы кэша появляются в корне проекта, укажите
CACHE_DB_PATHна отдельный каталог данных.
Упаковка npm
npm-пакет включает только build/, README.md, LICENSE и SECURITY.md. Команда npm pack запускает npm run build через prepack, поэтому пакет содержит скомпилированный JavaScript, а не локальные файлы планирования, тесты, кэши или артефакты, содержащие только исходный код.
Безопасность
См. SECURITY.md для получения инструкций по сообщению об уязвимостях и текущих примечаний по аудиту зависимостей.
Лицензия
ISC
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
No tool schema history has been recorded yet.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server for Google search results via SERP API
Docs: https://docs.keenable.ai/mcp-server Keenable is a free, remote MCP server that gives agents access to the web index. Search the web with ranked results and date/site filters, then fetch any indexed page as clean markdown. Works out of the box with no account or API key.
MCP server for searching Airweave collections with natural language queries.
Related MCP Servers
- AlicenseAqualityAmaintenanceA local-first, no-API-key MCP server that enables LLMs to search the web, fetch pages, and read documents using multiple engines and smart fallbacks.1060MIT
- AlicenseAqualityAmaintenanceMCP server for private web search via self-hosted SearXNG with local reranking, full-page content fetching via Firecrawl, and optional Ollama-powered query expansion and summaries.711621MIT
- AlicenseNot gradedqualityCmaintenanceA fully local MCP server that provides web search via self-hosted SearXNG and page-to-markdown conversion (static and JS-rendered), all aggregated behind a single endpoint for use with AI assistants.MIT
- 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.18MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/kefyusuf/local-websearch-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server