Skip to main content
Glama

web-search-mcp

Ein vollständig lokales, null externe API, null Schlüssel All-in-One-MCP-Tool, das DeepSeek Harness + LM Studio Folgendes bietet:

  1. Websuche – greift direkt auf in Festlandchina direkt erreichbare Suchmaschinen-Ergebnisseiten zu (Baidu / Bing China / 360 / Sogou), ohne Such-APIs aufzurufen;

  2. Ganzseiten-Parsing – nutzt Crawl4AI (lokales Chromium) zur Extraktion von Seitenstruktur + Text + Bildern;

  3. Bildbeschreibung – nutzt das lokale LM-Studio-Visionsmodell, um Bilder in chinesische Textbeschreibungen umzuwandeln (Bildverständnis findet serverseitig statt und umgeht damit die Einschränkung von DSH, binäre Bilder zu verwerfen).

Fünf MCP-Tools:

Tool

Funktion

search_web

Einzel-Engine-Suche, gibt Titel / URL / Zusammenfassung zurück

search_multi

Multi-Engine-Sammelsuche: parallele Abfrage von Baidu/Bing/360/Sogou, dedupliziert und zusammengeführt nach URL

scrape_url

Abrufen und Parsen der gesamten Seite (gefiltertes Markdown + Text + Bilder + Bildbeschreibungen)

search_and_extract

Suche → automatische Auflösung von Weiterleitungslinks → Abrufen und Parsen der ersten N Einträge, alles in einem Schritt

llm_extract

Dreistufige intelligente Extraktion: Regel-Filterung → kleines Modell extrahiert blockweise → großes Modell fasst zusammen

Das abgerufene Markdown wird standardmäßig dreifach entrauscht: ①PruningContentFilter-Version (wenn verfügbar); ②Entfernung der oberen Navigationsleiste + Löschung von Fußzeilen/Urheberrechts-/Werbe-Rauschzeilen; ③max_chars-Obergrenze (Standard 20000 Zeichen, bei Überschreitung abgeschnitten). So wird vermieden, dass Werbung und andere irrelevante Inhalte unnötig Kontext belegen.

llm_extract nutzt das lokale LLM, um die Text-Extraktion vollständig zu lösen: ①Regel-Filterung der Webseite → ②SMALL_MODEL (kleines Modell) extrahiert blockweise schnell Kernpunkte → ③LARGE_MODEL (großes Modell) fasst zu einer kohärenten Zusammenfassung zusammen.

⚠️ Modellwechsel spart VRAM (Standard): Wenn model_switching=true in config.py gesetzt ist, wechselt eine einzelne Instanz sequenziell – wenn das kleine Modell benötigt wird, wechselt es automatisch zu qwen3.5-4b (und deaktiviert das Denken), nach der Verarbeitung wechselt es zurück zum großen Modell qwen/qwen3.8-27b für die Zusammenfassung. Es ist zu jedem Zeitpunkt nur ein Modell geladen, um VRAM-Engpässe zu vermeiden. Bei false werden zwei Instanzen parallel verwendet (erfordert ausreichend VRAM).


Konfigurationsdatei (einfach hier ändern)

Alle variablen Konfigurationen sind in config.py zentralisiert. Für die zukünftige Wartung muss nur diese eine Datei geändert werden:

Gruppe

Schlüsselelemente

Beschreibung

LM-Studio-Verbindung

llm_base_url / llm_api_key

Endpunkt und Schlüssel

Visionsmodell

vision_model

Multimodales Modell für Bildbeschreibungen

LLM-Extraktion

small_model / large_model

Kleines Modell für schnelle Extraktion + großes Modell für Zusammenfassung

Suchstandard

default_engine / multi_engines / search_max_results usw.

Engine und Anzahl der Ergebnisse

Abrufstandard

scrape_max_chars / scrape_describe_images usw.

Text-Obergrenze, ob Bilder beschrieben werden

Extraktionsstandard

extract_max_chars / extract_chunk_chars

Parameter für die dreistufige Extraktion

Leistungsoptimierung (Route A)

cache_enabled / cache_ttl_hours / scrape_concurrency / vision_max_side

Festplatten-Cache, paralleles Abrufen mit Begrenzung, Visions-Bild-Downsampling

Crawl4AI

crawl4ai_base_dir

Datenverzeichnis (leer = innerhalb des Projekts)

Umgebungsvariablen (z. B. der env-Abschnitt in DSH cordis.patch.yml) können die Standardwerte in config.py weiterhin überschreiben, aber für den täglichen Gebrauch reicht es, config.py zu ändern. Nach der Änderung DSH neu starten, damit es wirksam wird.


Architektur

                    ┌──────────────────────────────┐
                    │  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(主模型)    │
                    └────────────────────┘
  • Suche, Abruf und Bildbeschreibung erfolgen vollständig lokal; der einzige Netzwerkzugriff ist das "Öffnen der Webseite selbst" (bei jeder Online-Suche unvermeidbar). Keine Drittanbieter-APIs, keine Schlüssel, Daten verlassen den Rechner nicht.

  • Bildbeschreibung ist serverseitiges Sehen: Crawl4AI extrahiert nur die Bild-URLs, dieses Tool lädt die Bilder herunter, ruft das Visionsmodell von LM Studio auf und wandelt die Bilder in Text um, bevor es sie an DSH zurückgibt. Daher ist die MCP-Brückenschicht von DSH (die binäre Bilder verwirft) kein Problem.


Installation

1. Umgebung

  • Python 3.10+ (Crawl4AI empfiehlt 3.11 / 3.12; bei 3.13 mit Abhängigkeitsproblemen auf 3.12 zurückgehen)

  • Docker optional installiert (dieses Projekt benötigt kein Docker; SearXNG ist auch nicht erforderlich, die Suche erfolgt durch direktes Abrufen)

  • LM Studio gestartet und Modell geladen

2. Abhängigkeiten installieren (in Festlandchina mit Spiegel)

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

Abhängigkeitshinweis: httpx + beautifulsoup4 sind erforderlich (Suche + MCP-Transport); lxml ist optional (wenn nicht installiert, wird automatisch auf die Standardbibliothek zurückgegriffen); crawl4ai wird nur für die Abruffunktion benötigt. Die MCP-Transportschicht ist handgeschrieben und nutzt nur die Python-Standardbibliothek, ohne Abhängigkeit von mcp/pydantic. Im schlimmsten Fall reicht also die Installation von httpx + beautifulsoup4 für die Suche.

3. LM-Studio-Visionsmodell konfigurieren (optional, aber für Bildbeschreibungen erforderlich)

Laden Sie in LM Studio ein bildunterstützendes Visionsmodell, z. B. Qwen2.5-VL-7B-Instruct, MiniCPM-V, LLaVA.

Umgebungsvariablen setzen (oder in .env schreiben, aber dieses Tool liest .env nicht automatisch – bitte im Startbefehl setzen):

Variable

Standard

Beschreibung

VISION_BASE_URL

http://localhost:1234/v1

LM-Studio-OpenAI-kompatibler Endpunkt

VISION_MODEL

leer

Name des in LM Studio geladenen Visionsmodells (wenn nicht gesetzt, werden Bildbeschreibungen übersprungen)

VISION_API_KEY

lm-studio

Für den lokalen Dienst reicht eine beliebige nicht-leere Zeichenfolge

⚠️ Einzelinstanz vs. Doppelinstanz: LM Studio lädt normalerweise nur ein Modell gleichzeitig. Wenn Ihr Haupt-Dialogmodell kein Visionsmodell ist, wird empfohlen, eine weitere LM-Studio-Instanz zu öffnen (anderen Port, z. B. 1235), die speziell das Visionsmodell lädt, und dann VISION_BASE_URL auf http://localhost:1235/v1 zu setzen.


Anbindung an DeepSeek Harness

Fügen Sie im Plugin-Bereich von cordis.yml einen Abschnitt hinzu (Beispiel in 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   # 抓取 + 图片描述较慢,务必调大
  • Wenn Sie ein venv verwenden, ändern Sie command auf .venv/Scripts/python.exe (absoluter Pfad).

  • Nach der Anbindung sieht das Modell drei Tools: mcp__websearch__search_web, mcp__websearch__scrape_url, mcp__websearch__search_and_extract.


Verwendungsbeispiele

Die Modellseite ruft die Tools natürlich auf, z. B.:

  • "Suche nach 'Neueste Fortschritte bei LLM-RAG'" → search_web(query="大模型 RAG 最新进展", engine="bing")

  • "Rufe diese Webseite ab und parse sie, und sag mir, was auf den Bildern ist" → scrape_url(url="https://...", describe_images=true)

  • "Suche für mich nach 'Bitcoin Kurs' und fasse die ersten 3 Artikel zusammen" → search_and_extract(query="比特币 行情", engine="bing", max_results=3)

Suchmaschinen-Auswahl:

engine

Beschreibung

baidu

Standard, Baidu; die zurückgegebenen URLs sind Weiterleitungslinks, search_and_extract löst sie automatisch auf

bing

Bing China, Ergebnis-URLs sind sauber, schwächster Anti-Scraping-Schutz, am besten für "Suche + Abruf" geeignet

360

360 Suche

sogou

Sogou (stärkerer Anti-Scraping-Schutz, schlägt gelegentlich fehl)


Bereitstellungsstatus (lokaler Rechner)

Abgeschlossen und auf diesem Rechner getestet:

  • Abhängigkeiten installiert: crawl4ai 0.9.2 + playwright + lxml + Chromium (über Inlands-Spiegel);

  • DSH-Konfiguration in ~/.dsh/profiles/web/cordis.patch.yml geschrieben;

  • Alle vier Suchmaschinen (Baidu/Bing/360/Sogou) liefern Ergebnisse;

  • Baidu-Weiterleitungslinks korrekt aufgelöst;

  • MCP-stdio-Protokoll vollständig durchgetestet (initialize / tools/list / tools/call / Fehlerbehandlung / Chinesisch UTF-8);

  • scrape_url (Ganzseiten-Markdown + Links + Bilder) und search_and_extract (Suche→Auflösung→Abruf→Bildextraktion) Ende-zu-Ende bestanden.

Einziger verbleibender manueller Schritt (für Bildbeschreibungen erforderlich):

  1. LM Studio öffnen → lokalen Dienst starten (Port 1234);

  2. Visionsmodell qwen/qwen3.8-27b laden (mit mmproj, unterstützt Bildeingabe);

  3. DSH neu starten (dsh web), dann sind die drei Tools mcp__websearch__* im Modell sichtbar.


Dateibeschreibung

  • server.py – MCP-Diensteinstieg (handgeschriebenes MCP stdio, null mcp/pydantic-Abhängigkeiten)

  • engines.py – Suchmaschinen-Abrufmodul (Baidu/Bing/360/Sogou)

  • vision.py – LM-Studio-Visionsmodell-Bildbeschreibung

  • cache.py – Festplatten-Cache-Modul (Abrufergebnisse / Bildbeschreibungs-Wiederverwendung, reine Standardbibliothek)

  • config.py – zentrale Konfiguration (alle variablen Elemente)

  • requirements.txt – Abhängigkeiten

  • .env.example – Beispiel für Visionsmodell-Umgebungsvariablen

  • cordis.example.yml – Beispiel für DSH-Anbindungskonfiguration

Leistungsoptimierung (Route A · umgesetzt)

Für die lokale Umgebung mit 20 GB VRAM + 32 GB RAM wurden vier Optimierungen ohne neue große Modelle umgesetzt:

Element

Beschreibung

Effekt

F1 Stufenweise Stapelverarbeitung

Bei search_and_extract(use_llm_extract=true) wird der „Modellwechsel" von 2× pro Seite auf 2× pro Aufruf reduziert (zuerst kleines Modell für Stapel-Extraktion, dann großes Modell für Stapel-Zusammenfassung)

3 Seiten von 6 Ladevorgängen → 2

F2 Paralleles Abrufen

Mehrseitiges Abrufen mit asyncio.gather + Semaphore(scrape_concurrency) begrenzt parallel

Chromium-I/O-intensiv, ca. 2~3× schneller

F3 Festplatten-Cache

Abrufergebnisse, Bildbeschreibungen werden nach (URL+Parameter)-Hash auf der Festplatte gespeichert, cache_ttl_hours für Ablauf

Gemessen: 4,14s → 0,01s (>400×)

F4 Weiterleitungsauflösung ohne Body-Download

resolve_url bevorzugt HEAD, bei Fehlschlag Fallback auf Streaming-GET, das nur die Antwortheader liest

Spart einen vollständigen Seitendownload

F5 Visions-Bild-Downsampling

Vor dem Senden an das Visionsmodell wird die längste Seite mit Pillow auf vision_max_side (Standard 800px) verkleinert

Bild-Token deutlich reduziert, schneller und spart KV-VRAM

F5 benötigt die optionale Abhängigkeit Pillow (bereits in requirements.txt); wenn nicht installiert, wird das Downsampling automatisch übersprungen, alle anderen Funktionen bleiben unberührt. Das Cache-Verzeichnis liegt standardmäßig im Projekt unter .cache/; mit CACHE_ENABLED=false kann es vollständig deaktiviert werden.

Bekannte Einschränkungen

  • Suchergebnisse enthalten gelegentlich Werbung (Baidu baidu.php?url=... sind Werbelinks, die nicht aufgelöst werden können und beim Abrufen übersprungen/Fehler erzeugen – das ist normal);

  • Anti-Scraping-Maßnahmen der Suchmaschinen können zu gelegentlichen Fehlern führen – einfach die Engine wechseln;

  • Beim Abrufen großer Seiten / vieler Bilder ist es langsam – unbedingt toolCallTimeoutMs in der DSH-Konfiguration erhöhen;

  • Die Qualität der Bildbeschreibungen hängt vom lokalen Visionsmodell selbst ab.

-
license - not tested
-
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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

View all MCP Connectors

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/meteoritesama/web-search-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server