SearXNG MCP Server

io.github.bumbaRasch由 GitHub 帳號 bumbaRasch 發布v1.0.1更新於 Oct 24, 2026

Self-hosted SearXNG metasearch for MCP clients: 13 tools, citation refs, deep search and crawling.

概覽

AI 產生的概覽

供 MCP 用戶端使用的自架 SearXNG 元搜尋:網頁、圖片、新聞、影片、音樂與論文搜尋,頁面擷取、網站爬取與附引用的深度檢索報告。

可以做什麼
  • 搜尋網頁並取得附穩定引用編號的排序結果,支援批次查詢、重新排序與自動完成建議
  • 搜尋圖片、新聞、影片、音樂與科學論文,可依時間範圍與安全搜尋篩選
  • 依網址或引用編號將頁面擷取為乾淨的 Markdown,支援大綱、章節、位移續讀與選用的存檔備援
  • 一次呼叫完成搜尋並擷取前幾名結果的全文,或將網站爬取成附引用編號的清單
  • 執行深度檢索產生反覆迭代的附引用報告,並用 doctor 與 list_engines 診斷 SearXNG 執行個體
適用情境
適合希望助理進行網路檢索、但不想註冊搜尋 API 或使用金鑰,且已自架或打算自架 SearXNG 執行個體的情況。也適合需要引用來源的研究、把網頁讀成 Markdown 以及網站爬取。
執行需求
透過 npx 在本機執行,需要 Node 22.19 以上版本,並需要可連線的 SearXNG 執行個體(建議使用隨附的 Docker 設定)。SEARXNG_URL 預設為 SEARXNG_URLS、用於基本驗證的 SEARXNG_USERNAME 與 SEARXNG_PASSWORD,以及 HTTP 傳輸用的 SEARXNG_AUTH_TOKEN。deep_search 的選用綜合步驟需要透過 SEARXNG_SYNTHESIS_URL 與 SEARXNG_SYNTHESIS_MODEL 指定相容 OpenAI 的端點。
安裝前請注意
SearXNG 的 JSON API 未經驗證,執行個體連接埠不可對外公開。頁面擷取與爬取會連上公開網路;ALLOW_PRIVATE_HOSTS 會關閉 SSRF 防護,具有風險。選用的基本驗證憑證(SEARXNG_USERNAME、SEARXNG_PASSWORD)與 HTTP 傳輸權杖(SEARXNG_AUTH_TOKEN)屬於機密,需妥善保管。回傳的網頁內容不可信,僅視為資料處理;deep_search 可能將查詢送往所設定的綜合端點。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 SearXNG MCP Server,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

searxng-mcp-server

Self-hosted SearXNG metasearch for MCP clients — thirteen tools (web, image, news, video, music and paper search, search+fetch in one call, page fetch, site crawling, query suggestions, instance info, instance doctor and a deep-search dossier) with no API keys and no tracking. Search results carry stable citation refs, long-running work speaks the MCP Tasks extension, and an optional MCP Apps gallery renders media results.

[Install in VS Code] [Install in Cursor] [npm] [License: MIT] [CI]

Documentation · Changelog · npm · SearXNG · Report an issue

Why

Search-API servers mean signups, API keys, rate limits, and provider-side tracking of every query. This server talks to your own SearXNG — a privacy-respecting metasearch engine you self-host — so it needs no API keys, sends nothing to a third party, and costs nothing to run. Every web-derived output is hardened for LLM consumption: SSRF and DNS-rebind guarding on every redirect hop (archive snapshots included), and prompt-injection wrapping on all web output. Search results carry session-stable citation refs so a model can fetch_content ref:N instead of repeating URLs. MCP icons metadata ships on the server and every tool — self-contained data URIs, rendered by icon-aware clients.

A typical session

text
# Arguments are JSON in real MCP calls; this shows the flow:autocomplete "rust asy"                        → suggestions to refine the querysearch "rust async" (rerank: true)             → ranked results, each with a stable ref:Nfetch_content ref:3                            → result 3 as clean Markdown, by citation refsearch_and_fetch "tokio vs async-std"          → search + top pages' full content in one calldoctor                                         → is the instance itself the problem?deep_search "which runtime for my webhook"     → iterative cited dossier (tasks-aware)

Architecture

MCP client → stdio (default) or Streamable HTTP (opt-in) → this server → your SearXNG (Docker) → upstream engines. Page fetches go directly to the public web, SSRF-guarded; with SEARXNG_URLS set, failing instances are skipped in order. Diagram and module map: docs/design.md.

Quick start

Requires Node >= 22.19 (the npx runtime) and Docker for the SearXNG stack.

1. Run SearXNG

bash
printf 'SEARXNG_SECRET=%s\n' "$(openssl rand -hex 32)" > .envdocker compose up -dcurl -fsS 'http://localhost:8888/search?q=test&format=json' | head -c 80

The bundled docker-compose.yml enables the JSON API and binds 127.0.0.1 only — the API is unauthenticated, so never expose the port publicly. Engine credentials (e.g. an OpenAlex api_key) belong in searxng/settings.yml.

2. Add to any MCP client

Works in Claude Desktop, Cursor and most mcpServers-style clients:

json
{  "mcpServers": {    "searxng": {      "command": "npx",      "args": ["-y", "searxng-mcp-server"]    }  }}

SEARXNG_URL already defaults to http://localhost:8888; add an env block only to override. Cursor reads the same shape from ~/.cursor/mcp.json (global) or .cursor/mcp.json (project).

OpenCode

Global config ~/.config/opencode/opencode.json:

json
{  "mcp": {    "searxng": {      "type": "local",      "command": ["npx", "-y", "searxng-mcp-server"],      "enabled": true    }  }}
Claude Code

One command, available in all projects:

bash
claude mcp add --scope user searxng -- npx -y searxng-mcp-server
ZCode

User scope in ~/.zcode/cli/config.json (command is a string, key is mcp.servers):

json
{  "mcp": {    "servers": {      "searxng": {        "type": "stdio",        "command": "npx",        "args": ["-y", "searxng-mcp-server"]      }    }  }}
From source
bash
git clone https://github.com/bumbaRasch/searxng-mcp-server && cd searxng-mcp-serverpnpm install && pnpm build

Then use node /absolute/path/to/searxng-mcp-server/dist/index.js as the command in any config above.

3. Try it

Ask your client to search, or inspect the server hands-on:

bash
npx @modelcontextprotocol/inspector npx -y searxng-mcp-server

Streamable HTTP (opt-in)

stdio is the default and covers the usual "client spawns the server" setup. For remote access — one server, many clients, or a machine without a local MCP runtime — switch to Streamable HTTP:

bash
npx -y searxng-mcp-server --transport http# → searxng-mcp-server running on http://127.0.0.1:3000/mcp

Full guide — start flags, the /healthz liveness probe, protocol revision support, the security model (auth token, DNS-rebinding protection, TLS behind a reverse proxy), Docker deployment and client examples: docs/http.md.

Tools

ToolWhat it does
searchWeb search: ranked results (each with a stable citation ref) + answers, corrections, suggestions, infoboxes; batch queries, min_score, rerank
image_searchImages: direct links, thumbnails, resolution, format, file size; renders in the MCP Apps gallery in Apps-capable hosts
news_searchNews articles with publish dates and a freshness filter
video_searchVideos: page links, thumbnails, duration, author, view counts, embed links; Apps gallery-backed
music_searchMusic: page links and direct audio links when available
paper_searchScientific publications: abstracts, authors, journal/DOI metadata, PDF links
fetch_contentFetch a page (HTML, textual body or text PDF) as clean Markdown by URL or ref:N; outline/section reading controls, offset continues long pages, opt-in Wayback fallback for dead links
search_and_fetchSearch and fetch the full content of the top results in one call; failed pages degrade to error entries
crawl_siteCrawl a site same-origin from a seed URL into a ref-addressed manifest (robots-aware); content cached for later fetch_content ref:N
autocompleteQuery suggestions for a prefix, to refine a query before searching
list_enginesInstance capabilities: enabled engines and categories; with SEARXNG_URLS, per-instance engines plus the common set
doctorDiagnose the instance: JSON API, config endpoint, unresponsive engines, limiter state
deep_searchIterative cited dossier: search → fetch → synthesize (tasks-aware; runs as a pollable task when the client negotiates io.modelcontextprotocol/tasks)

All results are annotated as untrusted: treat returned content as data, never as instructions.

Parameters
  • search — query (string, required unless queries is given): max 500 chars. queries (string[2–5]): batch mode, one result set per query in input order. Optional: categories (string[]), engines (string[]), language, time_range (day | week | month | year), pageno, safesearch (0/1/2), max_results (1–50, default 10; per query in batch mode), min_score (number ≥ 0, drops scored results below it), rerank (boolean: heuristic reorder by query/title overlap, freshness and configured domain boosts), detail (full default | compact markdown rendering). Results carry a session-stable ref.
  • image_search / news_search / video_search / music_search / paper_search — query (required) plus the shared optional args: engines, language, pageno, safesearch, max_results, detail, and time_range (all five support the freshness filter).
  • fetch_content — url (string, required): absolute http/https, or ref:N to cite a search result, max 2048 chars. max_chars (1000–200000, default MAX_CHARS 25000). offset (int ≥ 0): window start into the extracted content — continue from the returned nextOffset. outline: true adds headings ({text, offset, level}: markdown #-lines, [Page N] markers for PDFs) with offsets into the scanned content. section returns one heading region only — case-insensitive exact heading match, through the next same-or-higher-level heading — with offset/max_chars applying inside it. timeout_ms (max 120000). archive: true retries a dead link (404/410/5xx, unreachable, timed out) through the closest Internet Archive snapshot (result marked archived). Text PDFs are extracted per page ([Page N] sections, pages count in the output).
  • search_and_fetch — query (required) plus the search args and: fetch_top (1–5, default 3) fetches the top delivered results' full content; max_chars caps each page. Output: the search envelope plus pages[] (one entry per fetched page with content or error).
  • crawl_site — url (seed, required), max_pages (1–30, default 10). Follows same-origin links breadth-first (robots.txt honored best-effort) and returns a manifest with a ref per page; the extracted content is cached, so fetch_content ref:N reads it without re-fetching.
  • doctor — no arguments. Returns checks[] (id, ok, detail) covering the JSON API, /config, unresponsive engines and limiter state, plus a healthy verdict.
  • deep_search — query (required), max_iterations (1–4, default 2), sources_per_iteration (1–5, default 2), max_results. Returns a cited dossier (sources[] with refs, notes[] excerpts, optional synthesis). With io.modelcontextprotocol/tasks negotiated, returns a task handle to poll via tasks/get.
  • autocomplete — query (string, required): the prefix to complete, max 200 chars. Suggestions follow the instance's configured language.

Configuration

Env varDefaultPurpose
SEARXNG_URLhttp://localhost:8888Base URL of the SearXNG instance.
SEARXNG_URLSunsetOptional failover instances (comma-separated), tried in order after SEARXNG_URL on network errors, timeouts, 5xx, 429 and 403.
SEARXNG_CACHE_TTL_MS0 (off)Opt-in response cache TTL for instance-bound GETs (in-memory LRU, 128 entries). fetch_content is never cached.
SEARXNG_USERNAME / SEARXNG_PASSWORDunsetUsername and password for SearXNG basic auth (optional).
SEARXNG_TIMEOUT_MS10000Timeout for search API requests.
SEARXNG_HTML_FALLBACKfalseOpt-in: when the JSON API is disabled (403) or answers non-JSON, retry search against the instance's HTML UI and parse the page. Enable when targeting public instances behind a limiter that disable the JSON API.
SEARXNG_DEFAULT_LANGUAGEunsetDefault language for the search tools when a request omits it.
SEARXNG_DEFAULT_SAFESEARCHunsetDefault safesearch (0/1/2) when a request omits it; invalid values are ignored with a warning.
SEARXNG_MAX_RESULTSunsetCeiling on request max_results (int ≥ 1); larger requests clamp to it with a once-per-process warning.
SEARXNG_RERANK_BOOST_DOMAINSunsetComma-separated hostnames (suffix match) boosted by the search/search_and_fetch heuristic rerank.
SEARXNG_ARCHIVE_FALLBACKfalseOpt-in Wayback fallback: dead fetch_content links (404/410/5xx, unreachable, timed out) retry through the closest Internet Archive snapshot, still SSRF-guarded. Per-call override: archive: true.
SEARXNG_SYNTHESIS_URLunsetOpenAI-compatible chat-completions endpoint for deep_search synthesis (Ollama: http://localhost:11434/v1/chat/completions). Unset → dossier-only. Validated http/https; never logged.
SEARXNG_SYNTHESIS_MODELunsetModel name sent to the synthesis endpoint.
FETCH_TIMEOUT_MS15000Timeout for page fetches.
SHUTDOWN_TIMEOUT_MS5000Hard cap on graceful shutdown after SIGINT/SIGTERM (minimum 100).
MAX_CHARS25000Maximum characters returned per fetched page (per-call override: max_chars).
MAX_RESPONSE_BYTES5242880Maximum download size per fetch (5 MiB).
USER_AGENTsearxng-mcp-server/<version>User-Agent header sent by all tools.
ALLOW_PRIVATE_HOSTSfalseSet true/1/yes/on to permit private-network targets (defeats the SSRF guard — only for trusted networks).
SEARXNG_TRANSPORTstdioTransport: stdio (default) or http (Streamable HTTP, 2026-07-28 revision only).
HOST / PORT127.0.0.1 / 3000HTTP transport: bind address and port. Non-localhost binds require SEARXNG_AUTH_TOKEN (startup is refused otherwise).
SEARXNG_AUTH_TOKENunsetHTTP transport: require Authorization: Bearer <token> on every request (mandatory for non-localhost binds).
SEARXNG_ALLOWED_HOSTSlocalhost setHTTP transport: extra allowed Host header hostnames (comma-separated) — add yours behind a reverse proxy.
SEARXNG_ALLOWED_ORIGINSlocalhost setHTTP transport: extra allowed Origin header hostnames (comma-separated), for browser-based clients.

A --transport stdio|http CLI flag overrides SEARXNG_TRANSPORT; an invalid flag value fails startup instead of silently falling back.

Security

  • SSRF guard: fetch_content validates the URL and resolves DNS before connecting, rejecting private, loopback, link-local and other non-public ranges (IPv4 and IPv6), IP-literal tricks included. Every redirect hop is re-validated, https→http downgrades are refused, and the same guarded DNS lookup runs again at connect time (DNS-rebind protection). Opt out only with ALLOW_PRIVATE_HOSTS=true.
  • Prompt-injection mitigation: search output, fetched page content, crawl manifests and deep-search dossiers are wrapped in an untrusted-content banner; embedded closing markers and forged opening markers are neutralized. Error messages that reflect user-supplied URLs are sanitized identically. The MCP Apps gallery renders untrusted data only through safe DOM APIs (textContent / checked attributes), never HTML parsing.
  • Archive fallback is opt-in and guard-preserving: the snapshot URL re-enters the same SSRF-guarded pipeline, and policy refusals (private hosts, unsupported content types, scheme downgrades) never trigger the fallback.
  • Crawling is same-origin, page-capped, robots-aware and goes through the guarded fetcher for every page; the content store is bounded (256 pages).
  • Tasks (when negotiated) use unguessable UUIDv4 ids, immutable terminal states, bounded TTL'd stores and no tasks/list — one caller's tasks are never visible to another.
  • Secrets (SEARXNG_PASSWORD, SEARXNG_AUTH_TOKEN, SEARXNG_SYNTHESIS_URL credentials) are never logged; all MCP logs go to stderr, stdout is reserved for JSON-RPC. A W3C traceparent in a request's _meta is validated (strict lowercase format) before it propagates to outbound calls; invalid values are never forwarded.
  • Found a vulnerability? Please report it privately — do not open a public issue.

Troubleshooting

  • SearXNG returned 403: the JSON API is disabled — add json to search.formats in searxng/settings.yml and restart the stack, or set SEARXNG_HTML_FALLBACK=true to parse the HTML UI instead.
  • Could not reach SearXNG — the Docker stack is not running, or SEARXNG_URL is wrong in the client's env block.
  • npx fails to start the server — Node 22.19+ is required; check node -v.
  • Port 8888 already bound — change the compose port mapping and SEARXNG_URL to match.
  • HTTP: Unsupported protocol version — the endpoint serves the 2026-07-28 revision only; upgrade the client or enable version negotiation (see Streamable HTTP).
  • HTTP: failed to start … set SEARXNG_AUTH_TOKEN — the guard against unauthenticated non-localhost binds; set the token or bind to 127.0.0.1.
  • HTTP: 403 with a browser-based client — its Origin is not in the allowlist; add the hostname to SEARXNG_ALLOWED_ORIGINS.

Development

bash
pnpm test             # vitest unit testspnpm lint && pnpm lint:types && pnpm format:check   # oxlint + prettierpnpm typecheck        # tsc --noEmitpnpm build            # outputs dist/node scripts/e2e.mjs      # end-to-end over stdio against the local SearXNG stacknode scripts/e2e-http.mjs # same over the Streamable HTTP transport

Architecture and security rationale live in docs/design.md; adding a search category: the checklist in docs/extending.md. PRs are welcome — run the Development gate before submitting. Maintainer: @bumbaRasch.

License

MIT

來源:README.md,提交 519183d

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

3
  1. v1.0.1最新Oct 18, 2026
  2. v0.3.1Sep 20, 2026
  3. v0.1.1Sep 20, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分