Skip to main content
Glama

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 stop nur 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 genau web_search + web_read bereit. Der Start startet SearXNG nicht; die erste web_search startet 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 --help

Hinweis für den pi-Coding-Agenten: Das bash-Tool in pi erbt PATH vom Host. Wenn webx: command not found erscheint, führen Sie einmal uv tool install . aus oder setzen Sie export PATH="$PWD/.venv/bin:$PATH" in der Sitzung, in der Sie pi starten.

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              # stopped

Temporä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: 0 ok, 2 Nutzung/Validierung, 3 Laufzeit/Docker nicht verfügbar, 4 SearXNG-Fehler, 5 unsichere URL, 6 Abruf-/Extraktionsfehler, 7 nicht unterstützter Inhaltstyp (2xx mit image/*, application/pdf usw.). 4xx/5xx/Timeout von einer öffentlichen URL ist 6, nicht 7 (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 --pretty

Beispiele 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 trafilatura

Laufzeit & 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:latest

  • Aufgelöster Digest: sha256:ec536bcd1e83577aad4cc07f7ecb9a30858a9a905d2d57c8796abc83f872a036 (lokales Image ec536bcd1e83, SearXNG 2026.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 stop

Nie automatisch bei der Suche aktualisieren.

MCP-Lebenszyklus

  • Das Starten von webx-mcp startet SearXNG nicht.

  • Die erste web_search prüft http://127.0.0.1:8888/; wenn gestoppt, führt sie docker compose up -d + Polling aus und markiert started_by_mcp = true; wenn bereits laufend, markiert sie false.

  • web_read startet SearXNG nie.

  • Bei sauberem Beenden, wenn started_by_mcp && WEBX_MCP_STOP_ON_EXIT, führt sie compose stop aus; 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 ipaddress prüfen: Loopback, RFC1918-Privat, IPv6-ULA, Link-Local (169.254.0.0/16, fe80::/10), Multicast, unspezifiziert, reserviert, Metadaten 169.254.169.254 und den SearXNG-Endpunkt selbst ablehnen. Kein --allow-private in v1.

  • DNS-Rebinding-Restrisiko: Auflösen-dann-Verbinden kann Rebinding nicht perfekt verhindern, da httpx erneut 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, Location gegen aktuelle URL aufgelöst, erneut validiert, Schleife/Überschreitung schlägt fehl.

  • Abruf: User-Agent: webx/<version> local-research-tool, Verbindung 5s, Lesen 15s, gestreamt mit Content-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/pdf usw.) → Exit 7.

  • Extraktion: roher Body → trafilatura.extract(output_format="markdown", ...) + html2txt-Fallback; Kürzung nach der Extraktion an einer Wort-/Newline-Grenze, truncated + characters melden.

  • Keine Cookies, Auth-Header, POST oder Browser.

Betrieb & Fehlerbehebung

webx doctor ist die erste Diagnose.

Fehler

Wahrscheinliche Ursache

doctor sagt Docker nicht verfügbar

Docker/Compose installieren; webx read funktioniert weiterhin

Suche 403

json nicht in settings.yml aktiviert (prüfen Sie search.formats)

SearXNG startet, aber Suchen ergeben 0 Ergebnisse / 5xx

Upstream-Engines rate-limited / CAPTCHA auf Ihrer IP — prüfen Sie webx logs auf suspended_time=180 / Too many request / HTTP 403. Kein WebX-Bug; versuchen Sie eine andere Abfrage/Kategorie oder pinnen Sie Engines: webx search "…" --engine wikipedia --engine github (google cse ist oft die einzige Engine, die von dieser IP nicht rate-limited ist)

Reader liefert winzigen Text

JS-gerenderte Seite — versuchen Sie --recall oder eine andere Quelle; Browser-Rendering ist für v1 nicht vorgesehen

Reader lehnt URL ab

Private/Lokale Netzwerkablehnung — beabsichtigt

webx logs leer

SearXNG not runningwebx logs weist jetzt auf run webx up or webx search to start hin, statt still leer zu sein

WEBX_DATA_DIR=/tmp/... webx status sagt running:true, aber compose missing

Einzelner webx-searxng-Containername, der über Verzeichnisse geteilt wird — status zeigt jetzt compose: missing + Hinweis; Probe ist global 127.0.0.1:8888

webx: command not found in pi

~/.local/bin nicht auf PATH — siehe Installation ( uv tool install / export PATH="$PWD/.venv/bin:$PATH" )

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=webx

Manuelle 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 ownership

Hinweis zu httpbin.org: Live-httpbin.org liefert derzeit von einigen Netzwerken 503 Service Temporarily Unavailable (verifiziert 2026-08-20 via curl -A "webx/0.1.0" und curl -A "Mozilla/5.0" beide 503). Wenn webx read https://httpbin.org/html 503 liefert, verwenden Sie stabile Alternativen: https://example.com, https://en.wikipedia.org/wiki/Python_(programming_language) (gut für Kürzungs-/--links-Tests) oder https://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

A
license - permissive license
Not graded
quality - not tested
B
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 Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables AI assistants to perform web searches and read URL content via a SearXNG instance.
    2
    15
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables local LLMs to search the web and fetch clean content from URLs without API keys, using SearxNG and Mozilla Readability.
    2
    35
    MIT

View all related MCP servers

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.

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/Fatih0234/web-searxng'

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