serpent
serpent
Ein Open-Source-Metasuch-Backend, das für MCP- / KI-Agenten-Workflows entwickelt wurde.
Es aggregiert Ergebnisse von mehreren Suchmaschinen, gibt ein einheitliches Schema zurück und stellt sowohl eine Standard-HTTP-API als auch einen MCP-Server bereit, den LLM-Agenten direkt aufrufen können.
Warum existiert dies?
Die meisten Suchaggregatoren sind für menschenlesbare Ausgaben konzipiert: HTML-Seiten, Ergebniskarten, Paginierungs-UIs. Wenn ein LLM-Agent das Web durchsuchen muss, benötigt er etwas anderes: strukturiertes JSON, stabile Feldnamen, gleichzeitige Ergebnisse aus mehreren Quellen und eine vorhersehbare Fehlerbehandlung.
serpent ist für diesen Anwendungsfall konzipiert. Es ist kein SearXNG-Klon.
Positionierung
Agentenfreundliches Metasuch-Backend
MCP-First-Such-Gateway für LLM-Workflows
Strukturierte Such-API für KI-Pipelines
Unterstützte Anbieter
Google wird nicht direkt gescrapt. Der Grund ist praktisch: Googles Anti-Bot-Maßnahmen machen selbst gehostetes Scraping anfällig. Die Aufrechterhaltung eines zuverlässigen Scrapers gegen Googles sich ständig weiterentwickelnde Erkennung bedeutet ständige Ausfälle und einen hohen Wartungsaufwand. Für Produktionsanwendungsfälle sind Drittanbieter zuverlässiger und kostengünstiger.
Derzeit unterstützte Google-Anbieter:
Anbieter | Umgebungsvariable | Hinweise |
| Pay-per-Use; generell günstiger bei geringem Volumen | |
| 2.500 kostenlose Abfragen, danach Pay-per-Use |
Beide sind kostengünstige Optionen. Für gelegentliche oder geringe Nutzung ist serpbase.dev pro Abfrage tendenziell günstiger. Beide funktionieren; konfigurieren Sie, was Sie bevorzugen, oder beide als Fallback.
Websuche
Anbieter | Name | Methode | Authentifizierung |
DuckDuckGo |
| HTML-Scraping (Lite-Endpunkt) | Nein |
Bing |
| HTML-Scraping | Nein |
Yahoo |
| HTML-Scraping | Nein |
Brave |
| Offizielle Such-API | Optional (kostenlose Stufe: 2000/Monat) |
Ecosia |
| HTML-Scraping | Nein |
Mojeek |
| HTML-Scraping | Nein |
Startpage |
| HTML-Scraping (Best-Effort) | Nein |
Qwant |
| Interne JSON-API (Best-Effort) | Nein |
Yandex |
| HTML-Scraping (Best-Effort) | Nein |
Baidu |
| HTML-Scraping (Best-Effort) | Nein |
Anbieter, die als Best-Effort gekennzeichnet sind, verwenden undokumentierte Endpunkte oder Scraping-Ziele mit starken Anti-Bot-Maßnahmen. Sie können ohne Vorwarnung aufhören zu funktionieren.
Wissen / Referenz
Anbieter | Name | Methode | Authentifizierung |
Wikipedia |
| MediaWiki Action API | Nein |
Wikidata |
| Wikidata API (Entitätssuche) | Nein |
Internet Archive |
| Advanced Search API | Nein |
Entwickler
Anbieter | Name | Methode | Authentifizierung |
GitHub |
| GitHub REST API | Nein (Token erhöht Ratenlimit) |
Stack Overflow |
| Stack Exchange API | Nein (Schlüssel erhöht Limit) |
Hacker News |
| Algolia HN API | Nein |
| Öffentliche JSON-API | Nein | |
npm |
| npm Registry API | Nein |
PyPI |
| HTML-Scraping | Nein |
crates.io |
| crates.io REST API | Nein |
Akademisch
Anbieter | Name | Methode | Authentifizierung |
arXiv |
| Atom API | Nein |
PubMed |
| NCBI E-utilities | Nein (Schlüssel erhöht Ratenlimit) |
Semantic Scholar |
| Graph API | Nein (Schlüssel erhöht Ratenlimit) |
CrossRef |
| REST API (145M+ DOIs) | Nein |
Installation
# Clone the repository
git clone https://github.com/your-org/serpent
cd serpent
# Install with pip (editable)
pip install -e ".[dev]"
# Or with uv
uv pip install -e ".[dev]"Konfiguration
Kopieren Sie .env.example nach .env und tragen Sie Ihre Schlüssel ein:
cp .env.example .env# Required for Google search (at least one)
SERPBASE_API_KEY=your_key_here
SERPER_API_KEY=your_key_here
# Optional — omit to use unauthenticated/public access
BRAVE_API_KEY= # free tier: 2000 req/month
GITHUB_TOKEN= # raises rate limit from 60 to 5000 req/hour
STACKEXCHANGE_API_KEY= # raises limit from 300 to 10,000 req/day
NCBI_API_KEY= # PubMed; raises from 3 to 10 req/sec
SEMANTIC_SCHOLAR_API_KEY= # raises from 1 to 10 req/sec
# Server
HOST=0.0.0.0
PORT=8000
# Restrict which providers are active (comma-separated, empty = all available)
ENABLED_PROVIDERS=
ALLOW_UNSTABLE_PROVIDERS=false
# Timeouts in seconds
DEFAULT_TIMEOUT=10
AGGREGATOR_TIMEOUT=15
MAX_RESULTS_PER_PROVIDER=10Ausführung
HTTP-API-Server
python -m serpent.main
# or
serpentDer Server startet unter http://localhost:8000. Interaktive Dokumentation unter /docs.
MCP-Server
python -m serpent.mcp_server
# or
serpent-mcpDer MCP-Server kommuniziert über stdio. Verwenden Sie ihn mit jedem MCP-kompatiblen Client (Claude Desktop, cline, continue.dev, etc.).
Docker
Bauen Sie das Image:
docker build -t serpent .Führen Sie die HTTP-API aus:
docker run --rm -p 8000:8000 --env-file .env serpentOder mit Docker Compose:
docker compose up --buildDer Container startet die HTTP-API unter http://localhost:8000.
HTTP-API
POST /search
Aggregiert die Suche über alle aktivierten Anbieter.
curl -X POST http://localhost:8000/search \
-H "Content-Type: application/json" \
-d '{"query": "rust async runtime"}'Mit expliziten Anbietern und Parametern:
curl -X POST http://localhost:8000/search \
-H "Content-Type: application/json" \
-d '{
"query": "rust async runtime",
"providers": ["duckduckgo", "wikipedia"],
"params": {"num_results": 5, "language": "en"}
}'Antwort:
{
"engine": "serpent",
"query": "rust async runtime",
"results": [
{
"title": "Tokio - An asynchronous Rust runtime",
"url": "https://tokio.rs",
"snippet": "Tokio is an event-driven, non-blocking I/O platform...",
"source": "tokio.rs",
"rank": 1,
"provider": "duckduckgo",
"published_date": null,
"extra": {}
}
],
"related_searches": ["tokio vs async-std", "rust futures"],
"suggestions": [],
"answer_box": null,
"timing_ms": 843.2,
"providers": [
{"name": "duckduckgo", "success": true, "result_count": 10, "latency_ms": 840.1, "error": null},
{"name": "wikipedia", "success": true, "result_count": 3, "latency_ms": 320.5, "error": null}
],
"errors": []
}POST /search/google
curl -X POST http://localhost:8000/search/google \
-H "Content-Type: application/json" \
-d '{"query": "site:github.com rust tokio"}'GET /health
curl http://localhost:8000/health
# {"status": "ok"}GET /providers
curl http://localhost:8000/providers{
"available": [
{"name": "google_serpbase", "tags": ["google", "web"]},
{"name": "duckduckgo", "tags": ["web", "privacy"]},
{"name": "wikipedia", "tags": ["web", "academic", "knowledge"]},
{"name": "github", "tags": ["code", "web"]},
{"name": "arxiv", "tags": ["academic", "web"]}
],
"count": 5
}MCP-Nutzung
Konfigurieren Sie Ihren MCP-Client so, dass er serpent-mcp (oder python -m serpent.mcp_server) ausführt.
Beispiel für die Claude Desktop-Konfiguration (~/.claude/claude_desktop_config.json):
{
"mcpServers": {
"serpent": {
"command": "serpent-mcp",
"env": {
"SERPBASE_API_KEY": "your_key",
"SERPER_API_KEY": "your_key"
}
}
}
}Verfügbare MCP-Tools
search_web
Allgemeine Websuche über alle aktivierten Anbieter.
{
"query": "fastapi vs flask performance 2024",
"num_results": 10
}search_google
Google-Suche über einen konfigurierten Drittanbieter.
{
"query": "site:docs.python.org asyncio",
"provider": "google_serpbase"
}search_academic
Suche in arXiv und Wikipedia.
{
"query": "transformer architecture attention mechanism",
"num_results": 8
}search_github
Suche in GitHub-Repositories.
{
"query": "python mcp server implementation",
"num_results": 5
}compare_engines
Führen Sie dieselbe Abfrage über mehrere Anbieter aus und geben Sie die nach Engine gruppierten Ergebnisse zurück.
{
"query": "vector database comparison",
"providers": ["duckduckgo", "brave"],
"num_results": 5
}Referenz des Ergebnisschemas
Jedes Ergebnisobjekt hat diese Felder:
Feld | Typ | Beschreibung | |
| string | Ergebnistitel | |
| string | Ergebnis-URL | |
| string | Textauszug / Beschreibung | |
| string | Domainname | |
| int | 1-basierte Position in der endgültigen zusammengeführten Liste | |
| string | Anbieter, der dieses Ergebnis zurückgegeben hat | |
| string | null | ISO-Datum (JJJJ-MM-TT), falls verfügbar |
| object | Anbieterspezifische Daten (z. B. GitHub-Sterne, arXiv-Autoren) |
Entwicklung
# Install dev dependencies
pip install -e ".[dev]"
# Run tests
pytest
# Run with auto-reload
uvicorn serpent.main:app --reloadRoadmap
[ ] Caching-Schicht (In-Memory / Redis) für wiederholte Abfragen
[ ] Relevanz-Neubewertung über Anbieter hinweg
[ ] Weitere Anbieter: Bing (offizielle API), Kagi, Tavily
[ ] Ratenbegrenzung pro Anbieter mit Backoff
[ ] Streaming-Antworten (SSE) für lange Aggregationen
[ ] Docker-Image und Compose-Setup
[ ] Endpunkt zur Überwachung des Anbieterstatus
[ ] Ergebnis-Scoring und Konfidenzsignale
Lizenz
MIT
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/reurinkkeano/serpent'
If you have feedback or need assistance with the MCP directory API, please join our Discord server