VOOZH about

URL: https://glama.ai/mcp/servers/sweetcornna/free-search-mcp?locale=de-DE

⇱ free-search-mcp by sweetcornna | Glama


free-search-mcp

πŸ‘ License
πŸ‘ Python
πŸ‘ MCP

Ein Local-First-MCP-Server ohne API-Key (Model Context Protocol), der jedem LLM (Claude, GPT, lokales Ollama, …) die FΓ€higkeit verleiht, das Web zu durchsuchen, Seiten abzurufen und zu bereinigen sowie Dokumente zu lesen – ohne dass Sie sich fΓΌr eine einzige Such-API registrieren mΓΌssen.

Er bΓΌndelt die besten Ideen einer Handvoll Open-Source-MCPs in einem Python-Paket und ergΓ€nzt die LLM-Ergonomie und ZuverlΓ€ssigkeit, die bei den jeweiligen Projekten fehlten.

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…

Ein Tool-Aufruf. Drei Quellen. Kein API-Key. Keine OPENAI_API_KEY-fΓΌr-Suche-Abzocke.


Warum gibt es dieses Projekt?

Bestehende Such-MCPs erledigen jeweils eine Sache gut, aber meistens mΓΆchte man alles davon:

Multi-Engine

Kein API-Key

Intelligenter Fallback

PDF/DOCX

FTS5-Cache

Filter

Trafilatura

LLM-optimiert

nickclyde/duckduckgo-mcp-server

βœ—

βœ“

βœ—

βœ—

βœ—

βœ—

βœ—

~

mrkrsl/web-search-mcp

βœ“

βœ“

βœ“

βœ—

βœ—

βœ—

βœ—

~

Aas-ee/open-webSearch

βœ“

βœ“

~

βœ—

βœ—

βœ—

βœ—

~

VincentKaufmann/noapi-google-search-mcp

βœ—

βœ“

βœ“

βœ“

βœ“

βœ—

βœ—

~

free-search-mcp

βœ“

βœ“

βœ“

βœ“

βœ“

βœ“

βœ“

βœ“

"LLM-optimiert" bedeutet hier: Markdown-fokussierte Ausgabe, Token-SchÀtzungen, intelligentes Kürzen an Absatzgrenzen, Docstrings für "Best for / Not for / Returns / Common mistakes", die das Modell nutzt, um das richtige Tool auszuwÀhlen, hilfreiche Fehlermeldungen, MCP-Prompts und Ressourcenvorlagen sowie ein One-Shot-research(), das Suche→Abruf→Abruf→Abruf in einem einzigen Durchgang zusammenfasst.

"Trafilatura" bedeutet, dass wir Hauptinhalte mit trafilatura extrahieren – dem Gewinner des Bevendorff 2023 ROUGE-Benchmarks (~0,85 gegenΓΌber ~0,55 bei naivem Entfernen von Boilerplate). Jede abgerufene Seite liefert zudem kostenlos author, published_date und sitename.

"Filter" bedeutet, dass Suche/Recherche freshness, include_domains, exclude_domains, category (news/pdf/github/paper/forum/blog), include_text und exclude_text akzeptieren.


Related MCP server: TOOL4LM

Tools

Tool

Beschreibung

search(query, engines?, max_results?, use_cache?, max_age_hours?, freshness?, include_domains?, exclude_domains?, category?, include_text?, exclude_text?, format?)

Parallele Multi-Engine-Suche, zusammengefΓΌhrt via Reciprocal Rank Fusion

research(question, depth?, engines?, fetch?, use_cache?, max_age_hours?, freshness?, include_domains?, exclude_domains?, category?, include_text?, exclude_text?, format?)

One-Shot: Suche + Abruf der Top N + RΓΌckgabe einer Markdown-Zusammenfassung

fetch(url, render?, force_refresh?, max_age_hours?, format?)

Seite abrufen, RΓΌckgabe im Reader-Modus als Markdown (trafilatura-extrahiert, mit Autor/Datum/Sitename)

fetch_batch(urls, render?, format?)

Gleichzeitiger Abruf mehrerer URLs

read_doc(source, start?, length?, format?)

PDF / DOCX / HTML / TXT / MD mit Paginierung parsen

cache_search(query, limit?, format?)

FTS5-Suche ΓΌber zuvor abgerufene Seiten

engines()

Liste der fΓΌr search verfΓΌgbaren Engines

ZusΓ€tzlich 2 MCP-Prompts (Research thoroughly, Fact-check claim) und eine Ressourcenvorlage (cache://page/{url}), um zwischengespeicherte Seiten ohne erneuten Abruf wieder in den Kontext zu ziehen.

Filter (Suche / Recherche)

Parameter

Werte

Effekt

freshness

day / week / month / year

Nur Ergebnisse der letzten N

include_domains

["python.org", "djangoproject.com"]

Auf diese Domains beschrΓ€nken

exclude_domains

["pinterest.com"]

Diese ausschließen

category

news / pdf / github / paper / forum / blog

Content-Type-AbkΓΌrzung (paper = arxiv/acm/ieee/…, forum = reddit/HN/SE, etc.)

include_text

"async"

Teilstring in Titel/Snippet erforderlich

exclude_text

"beginner"

Teilstring verboten

max_age_hours

24

Überschreibt den standardmÀßigen 7-Tage-Cache-TTL für diesen Aufruf

Alle Tools verwenden standardmÀßig format="markdown" – lesbar, ca. 40 % weniger Token als JSON, mit Herkunftsnachweis und einem Token-Budget-Header. Verwenden Sie format="json" fΓΌr strukturierten Zugriff.

Tool-Annotationen

Jedes Tool enthΓ€lt korrekte readOnlyHint-, idempotentHint- und openWorldHint-Annotationen, damit MCP-Clients diese kennzeichnen und erweiterte Aktionen einschrΓ€nken kΓΆnnen.

Engines

Standard-Set (alle zuverlΓ€ssig, keine Captchas bei wiederholten Aufrufen): duckduckgo, mojeek, startpage.

Optional (gelegentliche Herausforderungen fΓΌr Headless-Clients): brave, bing, baidu.

Brave/Bing/Baidu blockieren Headless-Browser nach einigen Aufrufen (PoW-CAPTCHAs, "Etwas ist schiefgelaufen"-Seiten, Redirect-Wrapper). Verwenden Sie engines=["brave"] usw. nur, wenn die Standardeinstellungen nicht finden, was Sie benΓΆtigen.


Installation

git clone https://github.com/ymylive/free-search-mcp.git
cd free-search-mcp
uv sync
uv run playwright install chromium

AusfΓΌhrung als eigenstΓ€ndiger Server (stdio-Transport):

uv run search-mcp

Live-Tests ausfΓΌhren (greift auf das echte Web zu – Umgebungsvariable setzen):

SEARCH_MCP_TEST_NETWORK=1 uv run pytest -v

Offline-Tests laufen standardmÀßig und greifen nicht auf das Netzwerk zu.


Einbindung in Claude Desktop

FΓΌgen Sie dies zu ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) oder dem entsprechenden Pfad auf Ihrer Plattform hinzu:

{
 "mcpServers": {
 "search": {
 "command": "uv",
 "args": ["--directory", "/absolute/path/to/free-search-mcp", "run", "search-mcp"]
 }
 }
}

Starten Sie Claude Desktop neu. Die sieben oben genannten Tools erscheinen in der Tool-Leiste.

Einbindung in andere Clients

Der Server spricht einfaches MCP ΓΌber stdio. Alles, was MCP unterstΓΌtzt, funktioniert:

  • Claude Code (claude mcp add search uv --directory /…/free-search-mcp run search-mcp)

  • Cursor / Continue / Cline (verwenden Sie den JSON-Schnipsel oben)

  • Eigene Python / TypeScript-Clients ΓΌber das offizielle MCP-SDK


Konfiguration

Alle Einstellungen kΓΆnnen durch Umgebungsvariablen mit dem PrΓ€fix SEARCH_MCP_ ΓΌberschrieben werden:

Variable

Standard

Bedeutung

SEARCH_MCP_DEFAULT_ENGINES

["duckduckgo","mojeek","startpage"]

JSON-Liste

SEARCH_MCP_MAX_RESULTS_PER_ENGINE

10

SEARCH_MCP_RATE_LIMIT_PER_MINUTE

30

pro Engine

SEARCH_MCP_FETCH_RATE_LIMIT_PER_MINUTE

20

geteilter fetch-Bucket

SEARCH_MCP_CACHE_DIR

~/.cache/search-mcp

SEARCH_MCP_CACHE_TTL_SECONDS

604800

7 Tage

SEARCH_MCP_FETCH_STRATEGY

auto

auto / http / browser

SEARCH_MCP_BROWSER_HEADLESS

true

SEARCH_MCP_BROWSER_POOL_SIZE

2

gleichzeitige Seiten

SEARCH_MCP_MAX_CONTENT_CHARS

50000

KΓΌrzung pro Ergebnis


Architektur

 β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
 β”‚ 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 β”‚ β”‚ β”‚
 β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Engine-Adapter-Muster

Jede Engine in src/search_mcp/engines/ implementiert:

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]: ...

Die Basisklasse ΓΌbernimmt den Transport (httpx β†’ Playwright-Fallback), das Rate-Limiting und den Fall, dass HTTP statt Ergebnissen eine Captcha-Seite zurΓΌckgibt (automatische Wiederholung ΓΌber den Browser).


Credits

Dieses Projekt basiert auf der Arbeit von:


Lizenz

MIT β€” siehe LICENSE.

A
license - permissive license
A
quality
A
maintenance

Maintenance

–Maintainers
–Response time
2wRelease cycle
2Releases (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.

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