web-search-mcp
web-search-mcp
Полностью локальный, без внешних API, без ключей универсальный MCP-инструмент, предоставляющий DeepSeek Harness + LM Studio:
Поиск в вебе — напрямую парсит страницы результатов поисковых систем, доступных из материкового Китая (Baidu / Bing Китай / 360 / Sogou), без вызова каких-либо поисковых API;
Разбор всей страницы — использует Crawl4AI (локальный Chromium) для извлечения структуры страницы + текста + изображений;
Описание изображений — использует локальную визуальную модель LM Studio для преобразования изображений в текстовые описания на китайском (понимание изображений происходит на стороне сервера, что обходит ограничение DSH на отбрасывание бинарных изображений).
Пять MCP-инструментов:
Инструмент | Назначение |
| Поиск в одном движке, возвращает заголовки / URL / сниппеты |
| Комбинированный поиск по нескольким движкам: параллельный запрос к Baidu/Bing/360/Sogou, дедупликация и объединение по URL |
| Захват и разбор всей страницы (отфильтрованный markdown + текст + изображения + описания изображений) |
| Поиск → автоматическое восстановление ссылок-редиректов → захват и разбор первых N результатов, всё за один шаг |
| Трёхэтапное интеллектуальное извлечение: фильтрация по правилам → извлечение по частям малой моделью → обобщение большой моделью |
Извлечённый markdown по умолчанию проходит тройное шумоподавление: ①версия с фильтром
PruningContentFilter(если доступна); ②удаление верхней навигационной панели + удаление строк шума нижнего колонтитула/авторских прав/рекламы; ③лимитmax_chars(по умолчанию 20000 символов, обрезка при превышении). Это предотвращает бесполезное занятие контекста рекламой и другим нерелевантным содержимым.
llm_extractиспользует локальную LLM для полного решения задачи извлечения основного текста: ①фильтрация страницы по правилам → ②SMALL_MODEL(малая модель) быстро извлекает ключевые моменты по частям → ③LARGE_MODEL(большая модель) обобщает в связное резюме.⚠️ Переключение моделей для экономии видеопамяти (по умолчанию): когда
model_switching=trueвconfig.py, последовательное переключение в одном экземпляре — когда нужна малая модель, автоматически переключается наqwen3.5-4b(с отключённым мышлением), после обработки переключается обратно на большую модельqwen/qwen3.8-27bдля обобщения, в каждый момент времени загружена только одна модель, что позволяет избежать нехватки видеопамяти. Если установитьfalse, используется двухэкземплярный параллельный режим (требуется достаточный объём видеопамяти).
Файл конфигурации (меняйте здесь)
Все изменяемые параметры сосредоточены в config.py, для дальнейшего обслуживания нужно менять только этот файл:
Группа | Ключевые параметры | Описание |
Подключение к LM Studio |
| Эндпоинт и ключ |
Визуальная модель |
| Мультимодальная модель для описания изображений |
Извлечение LLM |
| Малая модель для быстрого извлечения + большая для обобщения |
Поиск по умолчанию |
| Движки и количество результатов |
Захват по умолчанию |
| Лимит основного текста, описывать ли изображения |
Извлечение по умолчанию |
| Параметры трёхэтапного извлечения |
Оптимизация производительности (маршрут A) |
| Дисковый кэш, ограничение параллельного захвата, даунсэмплинг изображений для визуальной модели |
Crawl4AI |
| Каталог данных (пусто = внутри проекта) |
Переменные окружения (например, секция
envвcordis.patch.ymlDSH) по-прежнему могут переопределять значения по умолчанию изconfig.py, но для повседневных изменений достаточно правитьconfig.py. После изменений перезапустите DSH.
Архитектура
┌──────────────────────────────┐
│ web-search-mcp (本进程) │
关键词 ─────────────►│ 1. 抓取 百度/必应/360/搜狗 结果页 │──► 搜索结果(标题/URL/摘要)
│ 2. Crawl4AI 整页解析 │──► markdown / links / images
│ 3. 下载图片 ─► LM Studio 视觉模型 │──► 图片中文描述(文本)
└──────────────────────────────┘
▲ MCP stdio
┌─────────┴──────────┐
│ DeepSeek Harness │ (cordis.yml 里的 @deepseek-ai/dsh-mcp-client)
│ LM Studio(主模型) │
└────────────────────┘Поиск, захват и описание изображений выполняются полностью на локальной машине; единственный сетевой доступ — это «открытие самой веб-страницы» (неизбежно для любого онлайн-поиска), нет сторонних API, нет ключей, данные не покидают локальную машину.
Описание изображений — это визуализация на стороне сервера: Crawl4AI только извлекает URL изображений, а этот инструмент загружает изображения, вызывает визуальную модель LM Studio, преобразует изображения в текст и возвращает его в DSH. Поэтому мостовой слой MCP в DSH (который отбрасывает бинарные изображения) не является проблемой.
Установка
1. Окружение
Python 3.10+ (Crawl4AI рекомендует 3.11 / 3.12; при проблемах с зависимостями на 3.13 можно откатиться на 3.12)
Docker установлен — опционально (этому проекту не нужен Docker; SearXNG также не обязателен, поиск выполняется прямым парсингом)
LM Studio запущен и загружена модель
2. Установка зависимостей (для материкового Китая используйте зеркала)
cd web-search-mcp
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
# 下载 Crawl4AI 用的 Chromium(仅抓取功能需要;只用搜索可跳过)
playwright install chromiumПримечание о зависимостях:
httpx + beautifulsoup4обязательны (поиск + транспорт MCP);lxmlопционален (если не установлен, автоматически используется стандартная библиотека);crawl4aiнужен только для функции захвата. Транспортный уровень MCP написан вручную только на стандартной библиотеке Python и не зависит отmcp/pydantic, поэтому в худшем случае достаточно установить толькоhttpx + beautifulsoup4для поиска.
3. Настройка визуальной модели LM Studio (опционально, но обязательно для описания изображений)
Загрузите в LM Studio визуальную модель, поддерживающую ввод изображений, например Qwen2.5-VL-7B-Instruct, MiniCPM-V, LLaVA.
Установите переменные окружения (или запишите в .env, но этот инструмент не читает .env автоматически — задавайте в команде запуска):
Переменная | По умолчанию | Описание |
|
| OpenAI-совместимый эндпоинт LM Studio |
| пусто | Имя загруженной визуальной модели в LM Studio (если не задано, описание изображений пропускается) |
|
| Любая непустая строка для локального сервиса |
⚠️ Один экземпляр vs два экземпляра: LM Studio обычно загружает только одну модель в каждый момент времени. Если ваша основная модель для диалога не является визуальной, рекомендуется запустить ещё один экземпляр LM Studio (другой порт, например
1235) специально для визуальной модели, а затем указатьVISION_BASE_URLнаhttp://localhost:1235/v1.
Подключение к DeepSeek Harness
Добавьте блок в список плагинов в cordis.yml (пример см. в cordis.example.yml):
- id: mcp-websearch
name: '@deepseek-ai/dsh-mcp-client'
config:
serverName: websearch
transport: stdio
command: python
args: ['C:/Users/LiangYuelin/Desktop/workspace/web-search-mcp/server.py']
cwd: 'C:/Users/LiangYuelin/Desktop/workspace/web-search-mcp'
env:
VISION_BASE_URL: 'http://localhost:1234/v1'
VISION_MODEL: 'qwen2.5-vl-7b-instruct'
VISION_API_KEY: 'lm-studio'
toolCallTimeoutMs: 300000 # 抓取 + 图片描述较慢,务必调大Если используется venv, измените
commandна.venv/Scripts/python.exe(абсолютный путь).После подключения модель увидит три инструмента:
mcp__websearch__search_web,mcp__websearch__scrape_url,mcp__websearch__search_and_extract.
Примеры использования
Модель будет естественным образом вызывать инструменты, например:
«Найди "последние достижения RAG для больших моделей"» →
search_web(query="大模型 RAG 最新进展", engine="bing")«Захвати и разбери эту веб-страницу и скажи мне, что на изображениях» →
scrape_url(url="https://...", describe_images=true)«Найди "курс биткоина" и обобщи первые 3 статьи» →
search_and_extract(query="比特币 行情", engine="bing", max_results=3)
Выбор поискового движка:
engine | Описание |
| По умолчанию, Baidu; возвращаемые URL являются ссылками-редиректами, |
| Bing Китай, URL результатов чистые, самая слабая защита от парсинга, наиболее рекомендуется для «поиск + захват» |
| Поиск 360 |
| Sogou (сильная защита от парсинга, иногда сбои) |
Статус развёртывания (локальная машина)
Завершено и протестировано на локальной машине:
Зависимости установлены: crawl4ai 0.9.2 + playwright + lxml + Chromium (через китайские зеркала);
Конфигурация DSH записана в
~/.dsh/profiles/web/cordis.patch.yml;Все четыре поисковых движка (Baidu/Bing/360/Sogou) возвращают результаты;
Ссылки-редиректы Baidu корректно восстанавливаются;
Протокол MCP stdio полностью работает (initialize / tools/list / tools/call / обработка ошибок / китайский UTF-8);
scrape_url(весь markdown страницы + links + изображения) иsearch_and_extract(поиск → восстановление → захват → извлечение изображений) протестированы сквозным образом.
Единственный оставшийся ручной шаг (требуется для описания изображений):
Откройте LM Studio → включите локальный сервис (порт 1234);
Загрузите визуальную модель
qwen/qwen3.8-27b(с mmproj, поддерживает ввод изображений);Перезапустите DSH (
dsh web), и в модели появятся три инструментаmcp__websearch__*.
Описание файлов
server.py— точка входа MCP-сервиса (ручной MCP stdio, нулевая зависимость от mcp/pydantic)engines.py— модуль захвата поисковых движков (Baidu/Bing/360/Sogou)vision.py— описание изображений визуальной моделью LM Studiocache.py— модуль дискового кэша (результаты захвата / повторное использование описаний изображений, только стандартная библиотека)config.py— централизованная конфигурация (все изменяемые параметры)requirements.txt— зависимости.env.example— пример переменных окружения для визуальной моделиcordis.example.yml— пример конфигурации подключения к DSH
Оптимизация производительности (маршрут A · реализовано)
Для локальной среды с 20GB видеопамяти + 32GB ОЗУ выполнены четыре оптимизации без добавления новых больших моделей:
Пункт | Описание | Эффект |
F1 Пакетная обработка этапов | «Переключение моделей» в | 3 страницы: 6 загрузок/выгрузок → 2 |
F2 Параллельный захват | Многостраничный захват с | Chromium I/O-интенсивный, ускорение примерно в 2~3× |
F3 Дисковый кэш | Результаты захвата и описания изображений сохраняются на диск по хешу (URL+параметры), истечение по | Замерено: 4.14s → 0.01s (>400×) |
F4 Восстановление редиректов без загрузки тела |
| Экономия одной полной загрузки страницы |
F5 Даунсэмплинг изображений для визуальной модели | Перед отправкой в визуальную модель Pillow уменьшает самую длинную сторону до | Значительное снижение токенов изображений, быстрее и экономия KV-памяти |
Для F5 требуется опциональная зависимость
Pillow(уже в requirements.txt); если не установлена, даунсэмплинг автоматически пропускается, остальные функции не затрагиваются. Каталог кэша по умолчанию —.cache/внутри проекта; установкаCACHE_ENABLED=falseполностью отключает кэширование.
Известные ограничения
Результаты поиска иногда содержат рекламу (в Baidu
baidu.php?url=...— это рекламные ссылки, их невозможно восстановить, при захвате они пропускаются/выдают ошибку, это нормально);Защита поисковых движков от парсинга может вызывать случайные сбои — просто смените движок;
Захват больших страниц / множества изображений медленный, обязательно увеличьте
toolCallTimeoutMsв конфигурации DSH;Качество описания изображений зависит от самой локальной визуальной модели.
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
LLM-ready web search + instant answers + URL-to-clean-text fetch for agents and RAG.
The best web search for your AI Agent
Web search, page extraction and structured commerce, social and business data for AI agents
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/meteoritesama/web-search-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server