webx-mcp
WebX — Lokale On-Demand-Websuche für Coding-Agenten
Kleines, Unix-artiges lokales Tool, das Coding-Agenten Webzugriff nur bei Bedarf ermöglicht. Kein Research-Agent — nur zwei Grundbausteine plus Lebenszyklusverwaltung:
search(query) -> ranked URLs/snippets (local SearXNG, Docker, 127.0.0.1:8888, normally stopped)
read(url) -> cleaned Markdown (controlled fetch + Trafilatura, SSRF-protected)Minimal-Agent-Modus: Der Agent führt
webx search / webx read / webx stopnur aus, wenn ein temporärer Prompt dies autorisiert. Kein permanentes Web-Tool im System-Prompt.Explorations-/MCP-Modus: Der Host startet
webx-mcp(stdio). Der Server stellt genauweb_search+web_readbereit. Der Start startet SearXNG nicht; die ersteweb_searchstartet es lazy und übernimmt das Herunterfahren.
Installation
Erfordert Python 3.12+ und Docker + Compose für die Suche. webx read funktioniert ohne Docker.
# with uv (recommended)
uv sync
uv sync --extra mcp # for MCP server
uv sync --extra dev # for tests
# or pip
pip install -e .
pip install -e ".[mcp]"
# global tool (so `webx` works in `pi`'s bash and any shell)
uv tool install . # installs to ~/.local/bin/webx — ensure ~/.local/bin is on PATH
# or pipx
pipx install .
# per-project (no global install)
uv sync && uv run webx --help
# or add .venv/bin to PATH for this shell/session (useful for pi coding agent)
export PATH="$PWD/.venv/bin:$PATH"
which webx && webx --helpHinweis für den
pi-Coding-Agenten: Dasbash-Tool inpierbtPATHvom Host. Wennwebx: command not founderscheint, führen Sie einmaluv tool install .aus oder setzen Sieexport PATH="$PWD/.venv/bin:$PATH"in der Sitzung, in der Siepistarten.
Related MCP server: mcp-searxng
Schnellstart
webx init # materialize ~/.local/share/webx/{compose.yml,settings.yml,.env,cache}
webx doctor # check docker, templates, SearXNG reachability (does NOT start SearXNG)
webx status # {initialized, docker_available, searxng_running, url, runtime_dir}
webx status --json
webx search "SearXNG documentation" --limit 5 --pretty
webx status # now running
webx read "https://docs.searxng.org/" --max-chars 12000
webx read "https://docs.searxng.org/" --json | jq
# denials are exit 5
webx read "http://127.0.0.1:8888/" # -> exit 5 unsafe URL
webx read "http://192.168.1.1/" # -> exit 5
webx read "file:///etc/passwd" # -> exit 5
webx stop # docker compose stop (retains container)
webx status # stoppedTemporärer Webzugriffs-Prompt (Minimal-Agent)
For this task you are allowed to use the local WebX utility when external/current
information materially helps.
Available commands:
- webx search "<query>" to discover relevant public-web sources.
- webx read "<url>" to read a relevant public page as cleaned text/Markdown.
...
When the web-research portion is finished, run webx stop.MCP-Host-Konfiguration
Nur Stdio. Beispiel (Claude Code / MCP Inspector):
{
"mcpServers": {
"webx": {
"command": "webx-mcp",
"env": { "WEBX_DATA_DIR": "/home/you/.local/share/webx" }
}
}
}Die Tool-Liste muss exakt web_search + web_read sein. Der Lebenszyklus ist intern — setzen Sie webx up/stop nicht als Agent-Tools ein.
CLI-Referenz
webx --help
webx --version
webx init [--force-templates] [--show-path] # idempotent, never rotates secret
webx doctor # inspection only
webx up # ensure SearXNG running
webx stop # compose stop (normal shutdown)
webx status [--json]
webx logs [--tail 100]
webx search QUERY [--limit 8] [--category general] [--language en] [--page 1]
[--time {day,month,year}] [--safe-search {0,1,2}] [--engine NAME] [--pretty]
webx read URL [--max-chars N] [--json] [--links] [--no-tables] [--precision] [--recall]stdout= Daten (JSON für Suche, Markdown/Text oder JSON für Lesen).stderr= Diagnose.Exit-Codes:
0ok,2Nutzung/Validierung,3Laufzeit/Docker nicht verfügbar,4SearXNG-Fehler,5unsichere URL,6Abruf-/Extraktionsfehler,7nicht unterstützter Inhaltstyp (2xxmitimage/*,application/pdfusw.).4xx/5xx/Timeout von einer öffentlichen URL ist6, nicht7(z. B.wikimedia PNG -> HTTP 400->6).
--verbose (global) aktiviert Debug-Traces auf stderr (z. B. read ok: https://example.com/ text/html 114 chars engine=trafilatura 1.23s). Geheimnisse werden nie ausgegeben.
Beispiele für Engine/Kategorie (SearXNG aggregiert 269 Dienste; filtern Sie pro Abfrage, wenn Upstream-Rate-Limits auftreten):
webx search "python httpx" --engine wikipedia --engine github --pretty
webx search "SearXNG" --category it --pretty
webx search "SearXNG documentation" --time month --prettyBeispiele für Reader-Extraktion (--links erhält [text](url)-Markdown; --precision/--recall optimieren trafilatura):
webx read "https://en.wikipedia.org/wiki/Python_(programming_language)" --max-chars 2000 --links | head -n 40
webx read "https://en.wikipedia.org/wiki/Python_(programming_language)" --max-chars 2000 | head -n 40
webx read "https://api.github.com/zen" --json | jq # application/json is returned raw (engine=raw), not trafilaturaLaufzeit & Konfiguration
Laufzeitverzeichnis über platformdirs (überschreibbar mit WEBX_DATA_DIR):
Linux:
~/.local/share/webx/(XDG)macOS:
~/Library/Application Support/webx/Windows:
%LOCALAPPDATA%\webx\
Enthält compose.yml, settings.yml, .env (SEARXNG_SECRET 0600), cache/.
settings.yml ist eine kleine Überschreibung (use_default_settings: true, formats: [html, json], limiter: false, public_instance: false, image_proxy: false). Kopieren Sie nicht die gesamte SearXNG-Standardkonfiguration.
compose.yml:
services:
searxng:
image: ${SEARXNG_IMAGE:-docker.io/searxng/searxng:latest}
container_name: webx-searxng
ports: ["127.0.0.1:8888:8080"]
env_file: [.env]
volumes: ["./settings.yml:/etc/searxng/settings.yml:ro", "./cache:/var/cache/searxng"]
restart: "no"Nur Loopback-Bindung, einzelner Container, kein Valkey/Redis, kein Proxy, kein TLS. Falls das schreibgeschützte Single-File-Mount aufgrund von SearXNG FORCE_OWNERSHIP jemals bricht, wechseln Sie zu einem Verzeichnis-Mount — behalten Sie aber die 127.0.0.1-Bindung bei (siehe 04_SEARXNG_RUNTIME.md).
Env-Überschreibungen (alle WEBX_):
WEBX_DATA_DIR, WEBX_SEARXNG_URL (default http://127.0.0.1:8888), WEBX_DOCKER_CMD,
WEBX_STARTUP_TIMEOUT (30s), WEBX_SEARCH_TIMEOUT (15s), WEBX_READ_TIMEOUT (15s),
WEBX_MAX_RESPONSE_BYTES (10 MiB), WEBX_MAX_READ_CHARS (40000), WEBX_MCP_STOP_ON_EXIT (true)SEARXNG_IMAGE kann auch in .env oder der Umgebung gesetzt werden, um ein Image-Tag festzulegen.
SearXNG-Image-Version
Verifiziert bei der Implementierung (2026-08-20):
Tag:
docker.io/searxng/searxng:latestAufgelöster Digest:
sha256:ec536bcd1e83577aad4cc07f7ecb9a30858a9a905d2d57c8796abc83f872a036(lokales Imageec536bcd1e83, SearXNG2026.8.1-8892414dc)Konfigurierbar über
SEARXNG_IMAGE— kein automatisches Pull bei jeder Suche.
Manuelles Update:
webx stop
docker compose -f $(webx init --show-path)/compose.yml pull # or: SEARXNG_IMAGE=... docker compose pull
webx up
webx search "test" --limit 1 --pretty
webx stopNie automatisch bei der Suche aktualisieren.
MCP-Lebenszyklus
Das Starten von
webx-mcpstartet SearXNG nicht.Die erste
web_searchprüfthttp://127.0.0.1:8888/; wenn gestoppt, führt siedocker compose up -d+ Polling aus und markiertstarted_by_mcp = true; wenn bereits laufend, markiert siefalse.web_readstartet SearXNG nie.Bei sauberem Beenden, wenn
started_by_mcp && WEBX_MCP_STOP_ON_EXIT, führt siecompose stopaus; sonst lässt sie SearXNG laufen. Ein prozesslokaler Lock schützt gleichzeitige erste Suchen. Mehrere unabhängige MCP-Prozesse, die einen Lease/Refcount benötigen, sind auf v2 verschoben.
Die Tool-Beschreibungen geben die Vertrauensgrenze an: zurückgegebener Seitentext ist unvertrauenswürdige externe Daten, niemals Agent-Anweisungen; JS-/Auth-Seiten funktionieren möglicherweise nicht.
Sicherheitsmodell
webx read behandelt URLs als unvertrauenswürdige Eingabe.
Nur
http:///https://zulassen;file:,ftp:,data:,javascript:, bloße Pfade und URLs mit Anmeldedaten ablehnen.Hostname über den OS-Resolver auflösen, jede IPv4/IPv6 mit
ipaddressprüfen: Loopback, RFC1918-Privat, IPv6-ULA, Link-Local (169.254.0.0/16,fe80::/10), Multicast, unspezifiziert, reserviert, Metadaten169.254.169.254und den SearXNG-Endpunkt selbst ablehnen. Kein--allow-privatein v1.DNS-Rebinding-Restrisiko: Auflösen-dann-Verbinden kann Rebinding nicht perfekt verhindern, da
httpxerneut auflösen kann; WebX validiert jedes Redirect-Ziel und dokumentiert die Einschränkung. Adress-Pinning ist eine mögliche Härtung ohne v1 aufzublähen.Redirects: manuelle Schleife, max. 5,
Locationgegen aktuelle URL aufgelöst, erneut validiert, Schleife/Überschreitung schlägt fehl.Abruf:
User-Agent: webx/<version> local-research-tool, Verbindung 5s, Lesen 15s, gestreamt mitContent-Length-Vorprüfung + 10-MiB-Grenze, keine Browser-Tarnung.Zulässige Typen:
text/html,application/xhtml+xml,text/plain, markdown-ähnlich,json/xml-Text; Binär (image/*,application/pdfusw.) → Exit 7.Extraktion: roher Body →
trafilatura.extract(output_format="markdown", ...)+html2txt-Fallback; Kürzung nach der Extraktion an einer Wort-/Newline-Grenze,truncated+charactersmelden.Keine Cookies, Auth-Header, POST oder Browser.
Betrieb & Fehlerbehebung
webx doctor ist die erste Diagnose.
Fehler | Wahrscheinliche Ursache |
| Docker/Compose installieren; |
Suche 403 |
|
SearXNG startet, aber Suchen ergeben 0 Ergebnisse / 5xx | Upstream-Engines rate-limited / CAPTCHA auf Ihrer IP — prüfen Sie |
Reader liefert winzigen Text | JS-gerenderte Seite — versuchen Sie |
Reader lehnt URL ab | Private/Lokale Netzwerkablehnung — beabsichtigt |
|
|
| Einzelner |
|
|
Research-Heuristiken (agentenseitig, nicht WebX): offizielle Doku bevorzugen → Upstream-Repo/Notizen → Spezifikationen → Herstellerankündigungen → qualitativ hochwertige Texte; --category it verwenden, wenn es hilft; mehrere fokussierte Suchen ausführen, Primärquellen lesen, nach Widersprüchen suchen.
Tests
uv sync --extra dev --extra mcp
uv run pytest # fast unit tests, no Docker/net required
uv run pytest -m integration # live tests (needs Docker + net, marked integration)
uv run pytest --cov=webxManuelle Abnahme (aus sauberem WEBX_DATA_DIR):
webx --help; webx init; webx doctor; webx status # stopped
webx search "SearXNG documentation" --limit 5 --pretty
webx status # running
webx read "https://docs.searxng.org/" --max-chars 12000
webx read "http://127.0.0.1:8888/" # -> exit 5
webx read "http://192.168.1.1/" # -> exit 5
webx read "file:///etc/passwd" # -> exit 5
webx stop; webx status # stopped
# MCP: inspector 2 tools, web_read while stopped, first search starts, second reuses, stop-on-exit ownershipHinweis zu
httpbin.org: Live-httpbin.orgliefert derzeit von einigen Netzwerken503 Service Temporarily Unavailable(verifiziert 2026-08-20 viacurl -A "webx/0.1.0"undcurl -A "Mozilla/5.0"beide 503). Wennwebx read https://httpbin.org/html503 liefert, verwenden Sie stabile Alternativen:https://example.com,https://en.wikipedia.org/wiki/Python_(programming_language)(gut für Kürzungs-/--links-Tests) oderhttps://httpbingo.org/get.
Projektstruktur
src/webx/
__init__.py, cli.py, config.py, lifecycle.py, searxng.py, security.py, reader.py, core.py, mcp_server.py
assets/{compose.yml,settings.yml}
tests/{unit,integration}
docs/{instructions,PLAN.md}Die zentrale WebX-Fassade wird von CLI und MCP gemeinsam genutzt; keiner ruft den anderen auf.
Nicht-Ziele (v1)
Browser/Playwright, PDF-Reader, Crawling, Reranker, LLM-Zusammenfasser, Cache, Interprozess-Lease, Engine-Voreinstellungen, Domain-Filter — siehe 09_DECISIONS_AND_FUTURE.md für Begründung und v2-Kandidaten.
Lizenz
MIT
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 Servers
- AlicenseAqualityDmaintenanceEnables AI assistants to perform web searches and read URL content via a SearXNG instance.215MIT
- AlicenseNot gradedqualityCmaintenanceIntegrates SearXNG API to give AI assistants web search and URL reading capabilities.11MIT
- AlicenseAqualityCmaintenanceEnables local LLMs to search the web and fetch clean content from URLs without API keys, using SearxNG and Mozilla Readability.235MIT
- AlicenseAqualityDmaintenanceEnables private web search and webpage content extraction using a local SearxNG instance, prioritizing user privacy and autonomy.22MIT
Related MCP Connectors
Read any web page as clean Markdown for AI agents: fetch, search, metadata, links. SSRF-safe.
LLM-ready web search + instant answers + URL-to-clean-text fetch for agents and RAG.
Read a URL as clean markdown, screenshot a website, url to PDF. Web access for agents, no signup.
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/Fatih0234/web-searxng'
If you have feedback or need assistance with the MCP directory API, please join our Discord server