Local Web Search MCP Server
Local Web Search MCP Server
Offline-first MCP-Server für Websuche und Inhaltsabruf. Er benötigt keine externen API-Schlüssel und verwendet lokale Modelle für Intent-Klassifikation, optionale sprachübergreifende Suche, semantisches Re-Ranking und extraktive Deep-Search-Antworten.
Funktionen
Browser-Kontext-Pooling mit einer persistenten Playwright-Browser-Instanz.
Websuche über konfigurierbare Anbieter mit Health-Tracking und geordnetem Fallback.
Optionale föderierte Suche über alle konfigurierten Anbieter mit URL-Normalisierung, anbieterübergreifender Deduplizierung und Reciprocal Rank Fusion (RRF).
Optionale intentsensitive Suchweiterleitung mit konservativen Heuristiken, lokalem Klassifikator-Fallback und versionierten Anbieterprofilen.
Domänengefilterte Websuche für gezielte Site-Abfragen.
HTTP-first Seitenabruf mit GitHub-Raw- und RSS-Schnellpfaden sowie Playwright-Fallback für gerenderte Seiten.
SSRF-Schutz für
fetch_contentdurch Blockieren von localhost- und privaten Netzwerkzielen.Token-Bucket-Rate-Limiting für Such- und Abruf-Tools.
Semantischer Cache mit SQLite und
sqlite-vec.Optionale sprachübergreifende Query-Expansion mit lokalen Transformers.js-Modellen.
Saubere Markdown-Extraktion durch Readability, JSDOM und Turndown.
Related MCP server: searxng-mcp
Anforderungen
Node.js 20.9.0 oder neuer.
npm.
Netzwerkzugriff während der Installation für npm-Pakete, Playwright Chromium und den ersten Download von Modellen.
Installation
npm install
npm run buildDas postinstall-Skript lädt Playwright Chromium herunter. Bei der ersten Verwendung modellgestützter Funktionen lädt Transformers.js die erforderlichen Modelldateien in den lokalen Hugging-Face-Cache. Die erste Anfrage, die ein Modell lädt, kann langsam sein; spätere Anfragen nutzen den lokalen Cache erneut. Behalte ENABLE_CROSSLINGUAL=false für den leichtesten ersten Lauf. Offensichtliche strategy=auto-Intents werden durch Heuristiken aufgelöst, ohne den Intent-Klassifikator zu laden; mehrdeutige Auto-Abfragen können einen Erstlauf-Download des Klassifikators auslösen.
MCP-Client-Konfiguration
Füge den gebauten Server zu deiner MCP-Client-Konfiguration hinzu:
{
"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"
}
}
}
}Wenn das Paket global oder über einen Paket-Runner installiert ist, verwende den Binär-Einstiegspunkt:
{
"mcpServers": {
"websearch": {
"command": "local-websearch-mcp",
"args": [],
"env": {
"SEARCH_PROVIDERS": "duckduckgo,bing",
"ENABLE_CROSSLINGUAL": "false"
}
}
}
}Für paket-runner-basierte Clients kann der Befehl npx sein, mit args gesetzt auf ["-y", "local-websearch-mcp"], sobald das Paket aus der konfigurierten npm-Registry verfügbar ist.
Tools
Tool | Beschreibung |
| Durchsucht das Web und gibt sortierte Ergebnisse zurück. Verwende |
| Ruft eine URL ab und gibt sauberes Markdown mit Inhalts-Caching, Zeichensatzbehandlung, GitHub-Raw-Schnellpfaden, RSS-Feed-Extraktion und Playwright-Fallback zurück. |
| Gibt Anbieterverfügbarkeit, Cache-Statistiken, Browserzustand, Routing-Profil-Metadaten, Feature-Flags und Betriebszeit zurück. |
Suchstrategien
Strategie | Verhalten | Semantischer Query-Cache |
| Versucht konfigurierte Anbieter in Reihenfolge und stoppt beim ersten brauchbaren Ergebnissatz. | Aktiviert |
| Fragt alle derzeit verfügbaren konfigurierten Anbieter parallel ab, dedupliziert URLs und fusioniert Rankings mit RRF. | Umgangen |
| Erkennt den Intent, erstellt einen Routing-Plan aus Profil | Umgangen |
auto ist bewusst opt-in; das Weglassen von strategy verwendet weiterhin fallback für Abwärtskompatibilität. Der semantische Query-Cache wird für aggregate und auto umgangen, da Query-Cache-Schlüssel noch nicht nach Ausführungsstrategie/Anbieterplan namespaced sind. Deep-Search-Seiteninhalte verwenden weiterhin den normalen Inhalts-Cache.
SEARCH_PROVIDERS ist sowohl eine Allowlist als auch die konfigurierte Anbietermenge. Auto-Routing aktiviert niemals einen Anbieter, der in SEARCH_PROVIDERS fehlt; das Routing-Profil ändert nur die Reihenfolge und wie viele konfigurierte Anbieter als primäre Kandidaten ausgewählt werden.
Für Aggregate-Auto-Profile werden sekundäre konfigurierte Anbieter nur kontaktiert, wenn alle ausgewählten primären Anbieter kein brauchbares Ergebnis liefern. Ein teilweiser primärer Erfolg wird akzeptiert, anstatt die Anfrage nur zur Erhöhung der Ergebnisanzahl zu erweitern. Dies begrenzt die Scraping-Last und reduziert unnötige Blockierung/CAPTCHA-Exposition.
Aktuelles Routing-Profil: v1.
Intent | Ausführung | Bevorzugte Reihenfolge | Primäres Ziel |
| 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 | alle konfigurierten |
| fallback | vorhandene konfigurierte Reihenfolge | alle konfigurierten |
Diese Anbieterpräferenzen sind anfängliche Hypothesen, keine dauerhaften Qualitätsaussagen. Sie sind versioniert, sodass spätere Releases sie anhand deterministischer und Live-Evaluationsnachweise anpassen können, ohne Routing-Bedingungen im Server zu verstreuen.
Beispiel für intentsensitive Suchargumente:
{
"query": "PostgreSQL connection pooling best practices",
"strategy": "auto",
"max_results": 5
}Verwende domain für gezielte Suchen wie react.dev oder github.com. Die Intent-Erkennung erhält immer die ursprüngliche Abfrage; site:<domain> wird erst danach für die Anbieterausführung angehängt.
{
"query": "server components reference",
"domain": "react.dev",
"strategy": "auto",
"max_results": 5
}Verwende deep=true nur, wenn der Client benötigt, dass der Server Top-Seiten abruft und eine wahrscheinliche Antwort aus dem Seitentext extrahiert. Die MCP-Client-LLM bleibt für die endgültige Argumentation und Zusammenfassung verantwortlich.
Such-Snippets mit alten erkannten Daten enthalten eine kurze Frischewarnung, damit Clients veraltete Quellen vorsichtig behandeln können.
Beispiel für föderierte Suchargumente:
{
"query": "postgres connection pooling strategies",
"strategy": "aggregate",
"max_results": 5
}fetch_content verwendet schnelle quellenspezifische Pfade, bevor ein Browser geöffnet wird:
GitHub-Repository-, Blob-, Tree- und Raw-URLs werden, wenn möglich, von
raw.githubusercontent.comgelesen.RSS- oder Atom-Feed-URLs sowie häufige Blog-/News-Feed-Pfade werden in eine Markdown-Liste aktueller Einträge umgewandelt.
Normale HTML-Seiten verwenden weiterhin HTTP-first Readability-Parsing mit Playwright-Fallback.
Konfiguration
Variable | Standard | Beschreibung |
|
| Maximale |
|
| Maximale |
|
| Kommagetrennte Anbieter-Allowlist/-Reihenfolge. Unterstützte Werte: |
|
| Aktiviert Spracherkennung und sprachübergreifende Suchunterstützung. Dies kann Erstlauf-Downloads lokaler Modelle auslösen. Wenn deaktiviert, leiten Query-Heuristiken weiterhin unterstützte Locales wie Türkisch ab. |
|
| Playwright-Wartestrategie. Verwende |
| nicht gesetzt | Setze auf |
|
| Pfad zur SQLite-Cache-Datenbank. |
|
| Intervall für die Bereinigung abgelaufener Inhalts-Cache-Einträge. |
Docker
npm run docker:build
npm run docker:upDocker Compose speichert den SQLite-Cache in einem benannten Volume, das unter /app/data gemountet ist, und speichert Hugging-Face-Modelle in einem separaten benannten Volume. Der Container setzt CACHE_DB_PATH=/app/data/websearch_cache.db.
Entwicklung
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 startet den kompilierten Server über stdio, verifiziert die drei web_search-Strategiewerte (fallback, aggregate, auto), prüft Routing-Diagnosen von server_status und bestätigt, dass fetch_content localhost blockiert. Es führt keine Live-Anbietersuche durch, wodurch CI unabhängig von Suchmaschinen-HTML/Netzwerkverfügbarkeit bleibt.
Deterministische TR/EN-Routing-Fixtures befinden sich in evals/search-routing/queries.jsonl und werden von der normalen Vitest-Suite ausgeführt. Sie validieren Intent-Abdeckung, konservatives Heuristikverhalten, Mehrdeutigkeits-Defer-Fälle und die Durchsetzung der Anbieter-Allowlist, ohne den echten Klassifikator zu laden oder Anbieter zu kontaktieren.
Fehlerbehebung
Wenn der Start nach der Installation fehlschlägt, führen Sie
npx playwright install chromiumaus.Wenn die erste modellgestützte Anfrage langsam ist, lassen Sie den Download des Transformers.js-Modells abschließen und versuchen Sie es erneut.
Wenn die Suche keine Ergebnisse liefert, ändern Sie die Reihenfolge/den Satz von
SEARCH_PROVIDERSoder versuchen Sie eine direktefetch_content-URL.Wenn der Aggregatmodus zu langsam ist oder eine Blockierung durch den Anbieter auslöst, verwenden Sie die Standardstrategie
fallback.Wenn
autofür Ihren Anwendungsfall einen zu breiten Suchplan wählt, verwenden Sie explizitfallbackoderaggregate; explizite Strategien umgehen den Auto-Planer.Wenn Docker Chromium nicht finden kann, erstellen Sie das Image mit
npm run docker:buildneu.Wenn Cache-Dateien im Projektstammverzeichnis erscheinen, setzen Sie
CACHE_DB_PATHauf ein dediziertes Datenverzeichnis.
npm-Paketierung
Das npm-Paket enthält nur build/, README.md, LICENSE und SECURITY.md. npm pack führt npm run build über prepack aus, sodass das Paket kompiliertes JavaScript anstelle von lokalen Planungsdateien, Tests, Caches oder reinen Quellartefakten enthält.
Sicherheit
Siehe SECURITY.md für Anweisungen zur Meldung und aktuelle Hinweise zur Abhängigkeitsprüfung.
Lizenz
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