free-search-mcp
Сервер протокола Model Context Protocol, работающий преимущественно локально и не требующий API-ключей. Он дает любой LLM (Claude, GPT, локальная Ollama и т. д.) возможность искать в интернете, загружать и очищать страницы, а также читать документы — без необходимости регистрироваться в каком-либо поисковом API.
Он объединяет лучшие идеи из нескольких MCP с открытым исходным кодом в один пакет Python и добавляет эргономику для LLM и надежность, которых им не хватало.
research("how does reciprocal rank fusion work", depth=3)
↓
# Research brief: how does reciprocal rank fusion work
_engines: duckduckgo, mojeek, startpage · sources: 3 · ~3,400 tokens_
## Sources
- [1] Reciprocal rank fusion | Elasticsearch Reference — <https://…>
- [2] Hybrid Search Scoring (RRF) | Microsoft Learn — <https://…>
- [3] RRF explained in 4 mins — Medium — <https://…>
## Documents
…full Markdown bodies of each page, ready for the LLM to read…Один вызов инструмента. Три источника. Никаких API-ключей. Никаких требований OPENAI_API_KEY для поиска.
Зачем это нужно
Существующие MCP для поиска хорошо справляются с чем-то одним, но обычно вам нужно всё сразу:
Несколько движков | Без API-ключа | Умный откат | PDF/DOCX | Кэш FTS5 | Фильтры | Trafilatura | Настройка под LLM | |
| ✗ | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ~ |
| ✓ | ✓ | ✓ | ✗ | ✗ | ✗ | ✗ | ~ |
| ✓ | ✓ | ~ | ✗ | ✗ | ✗ | ✗ | ~ |
| ✗ | ✓ | ✓ | ✓ | ✓ | ✗ | ✗ | ~ |
free-search-mcp | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
«Настройка под LLM» здесь означает: вывод в формате Markdown, оценка количества токенов, умное усечение на границах абзацев, строки документации «Best for / Not for / Returns / Common mistakes», которые модель использует для выбора правильного инструмента, полезные подсказки об ошибках, шаблоны промптов и ресурсов MCP, а также однократный вызов research(), который объединяет поиск→загрузку→загрузку→загрузку в один шаг.
«Trafilatura» означает, что мы извлекаем основной контент с помощью trafilatura — победителя теста ROUGE 2023 года (около 0,85 против 0,55 для простого удаления шаблонного кода). Каждая загруженная страница также бесплатно возвращает author, published_date и sitename.
«Фильтры» означают, что поиск/исследование принимают параметры freshness, include_domains, exclude_domains, category (news/pdf/github/paper/forum/blog), include_text, exclude_text.
Related MCP server: TOOL4LM
Инструменты
Инструмент | Описание |
| Параллельный поиск по нескольким движкам, объединенный через Reciprocal Rank Fusion |
| Однократный вызов: поиск + загрузка топ-N + возврат краткой сводки в Markdown |
| Загрузка страницы, возврат Markdown в режиме чтения (извлечено через trafilatura, с автором/датой/названием сайта) |
| Параллельная загрузка нескольких URL |
| Парсинг PDF / DOCX / HTML / TXT / MD с пагинацией |
| Поиск FTS5 по ранее загруженным страницам |
| Список имен движков, доступных для |
Плюс 2 промпта MCP (Research thoroughly, Fact-check claim) и шаблон ресурса (cache://page/{url}) для возврата кэшированных страниц в контекст без повторной загрузки.
Фильтры (search / research)
Параметр | Значения | Эффект |
|
| Только результаты за последние N |
|
| Ограничить этими доменами |
|
| Исключить эти домены |
|
| Ярлык типа контента (paper = arxiv/acm/ieee/…, forum = reddit/HN/SE и т. д.) |
|
| Подстрока, обязательная в заголовке/сниппете |
|
| Запрещенная подстрока |
|
| Переопределить стандартный TTL кэша в 7 дней для этого вызова |
Все инструменты по умолчанию используют format="markdown" — читабельно, примерно на 40% меньше токенов, чем JSON, с указанием источника и заголовком бюджета токенов. Передайте format="json" для структурированного доступа.
Аннотации инструментов
Каждый инструмент поставляется с правильными аннотациями readOnlyHint, idempotentHint и openWorldHint, чтобы клиенты MCP могли помечать их и ограничивать выполнение действий с повышенными привилегиями.
Движки
Набор по умолчанию (все надежные, без капчи при повторных вызовах):
duckduckgo, mojeek, startpage.
Опционально (периодические проверки для headless-клиентов):
brave, bing, baidu.
Brave/Bing/Baidu блокируют headless-браузеры после нескольких вызовов (PoW CAPTCHA, страницы «что-то пошло не так», редиректы). Передавайте
engines=["brave"]и т. д. только тогда, когда стандартные движки не могут найти то, что вам нужно.
Установка
git clone https://github.com/ymylive/free-search-mcp.git
cd free-search-mcp
uv sync
uv run playwright install chromiumЗапуск в качестве автономного сервера (транспорт stdio):
uv run search-mcpЗапуск живых тестов (обращаются к реальному интернету — установите переменную окружения):
SEARCH_MCP_TEST_NETWORK=1 uv run pytest -vОфлайн-тесты запускаются по умолчанию и не используют сеть.
Подключение к Claude Desktop
Добавьте это в ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) или эквивалентный файл на вашей платформе:
{
"mcpServers": {
"search": {
"command": "uv",
"args": ["--directory", "/absolute/path/to/free-search-mcp", "run", "search-mcp"]
}
}
}Перезапустите Claude Desktop. Семь инструментов выше появятся в панели инструментов.
Подключение к другим клиентам
Сервер использует обычный MCP через stdio. Работает всё, что поддерживает MCP:
Claude Code (
claude mcp add search uv --directory /…/free-search-mcp run search-mcp)Cursor / Continue / Cline (используйте фрагмент JSON выше)
Пользовательские клиенты на Python / TypeScript через официальный SDK MCP
Конфигурация
Все настройки можно переопределить с помощью переменных окружения с префиксом SEARCH_MCP_:
Переменная | По умолчанию | Значение |
|
| Список JSON |
|
| |
|
| на движок |
|
| общий пул |
|
| |
|
| 7 дней |
|
|
|
|
| |
|
| параллельные страницы |
|
| усечение на результат |
Архитектура
┌─────────────────────────────────────────────────────┐
│ FastMCP server (stdio) │
│ tools: search / research / fetch / fetch_batch / │
│ read_doc / cache_search / engines │
└────────────┬────────────────────────────────────────┘
│
┌────────────▼────────────┐ ┌────────────────────────┐
│ aggregator │ │ fetcher │
│ - parallel engines │ │ - httpx fast path │
│ - reciprocal rank │ │ - playwright fallback │
│ fusion │ │ - markdownify │
│ - search cache (FTS5) │ │ - page cache (FTS5) │
└────┬────────────────────┘ └────────────┬───────────┘
│ │
┌────▼─────────────────┐ ┌──────────────▼─────────────┐
│ engines/ │ │ browser pool │
│ duckduckgo.py │ │ - persistent context │
│ mojeek.py │ │ - stealth init script │
│ startpage.py │ │ - shared cookies │
│ brave.py (opt) │ │ - semaphore-bounded pages│
│ bing.py (opt) │ └────────────────────────────┘
│ baidu.py (opt) │
└──────────────────────┘
┌────────────────────────────┐ ┌──────────────────┐
│ documents/ │ │ ratelimit │
│ pypdf, python-docx, │ │ token bucket │
│ markdownify │ │ per engine │
└────────────────────────────┘ └──────────────────┘
┌────────────────────────────┐ ┌──────────────────┐
│ formatting │ │ research │
│ token estimate │ │ composed │
│ smart truncation │ │ workflow │
│ markdown renderers │ │ │
└────────────────────────────┘ └──────────────────┘Паттерн адаптера движка
Каждый движок в src/search_mcp/engines/ реализует:
class Engine:
name: str
needs_browser: bool # Force Playwright?
wait_selector: str | None # CSS to wait for in browser mode
def build_url(self, query: str, max_results: int) -> str: ...
def parse(self, html: str) -> list[SearchResult]: ...Базовый класс обрабатывает транспорт (httpx → откат к Playwright), ограничение частоты запросов и случай, когда HTTP возвращает капчу вместо результатов (автоматические повторные попытки через браузер).
Благодарности
Этот проект стоит на плечах гигантов:
mrkrsl/web-search-mcp— умная стратегия загрузки httpx-затем-Playwright, цепочка отката по нескольким движкамAas-ee/open-webSearch— широта охвата движков (Bing/DDG/Baidu/Brave/Startpage)VincentKaufmann/noapi-google-search-mcp— паттерны защиты от обнаружения (navigator.webdriver, UA, cookies), идея кэша SQLite FTS5, многоформатныйread_documentnickclyde/duckduckgo-mcp-server— ограничение частоты запросов на движок, очистка контента для LLMMojeek — независимый поисковый индекс, который не блокирует по User-Agent
Лицензия
MIT — см. LICENSE.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Appeared in Searches
Latest Blog Posts
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/sweetcornna/free-search-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server
