Searxng MCP
概览
作者提供的说明(英文原文)
MCP server for SearXNG aggregator — web search across multiple engines via Model Context Protocol
PopNx MCP 的三大支柱
这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。
- 用户评价i暂无评价评价功能将在后续阶段与账户功能一起开放
- 我们的基础检查i1 项中通过 1 项依据公开信息检查;尚未扫描代码
- 使用情况i非常新★ –
它能帮你做什么
我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。
- 连接方式: 在你的电脑上运行
- 传输方式: stdio
- 分类: 搜索与 AI 记忆
- 你需要填写:SEARXNG_URL
安装
选择你使用的 AI 应用,然后复制设置。
安装之前
- 基础检查:1 项中通过 1 项
- 在你的电脑上运行,拥有你的用户账户的权限(文件、网络、应用)。
- 需要你自己填写:
SEARXNG_URL
你需要
- Docker已安装 Docker
你用的是哪个应用?
在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。
打开 Claude Desktop → Settings → Developer → Edit Config,把下面的内容粘贴到 claude_desktop_config.json
{
"mcpServers": {
"searxng": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"SEARXNG_URL",
"ghcr.io/aicrafted/searxng-mcp:latest"
],
"env": {
"SEARXNG_URL": "your-value"
}
}
}
}在终端中运行这条命令
claude mcp add searxng --env SEARXNG_URL=your-value -- docker run -i --rm -e SEARXNG_URL ghcr.io/aicrafted/searxng-mcp:latest运行前请先填写空着的值。
或者自己复制设置
粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json
{
"mcpServers": {
"searxng": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"SEARXNG_URL",
"ghcr.io/aicrafted/searxng-mcp:latest"
],
"env": {
"SEARXNG_URL": "your-value"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
或者自己复制设置
粘贴到项目中的 .vscode/mcp.json
{
"servers": {
"searxng": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"SEARXNG_URL",
"ghcr.io/aicrafted/searxng-mcp:latest"
],
"env": {
"SEARXNG_URL": "your-value"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
这个服务器在你的电脑上运行,而 ChatGPT 只能连接互联网上的服务器。请选择其他应用。
你的选择通过 Cookie 保存在这台设备上,无需账户。
需要你填写的值
- URL of your SearXNG instance
这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
它能做什么
它在你的电脑上运行;安装后,工具列表会显示在你的 AI 应用中。
基础检查i
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月10日
- ✓ 通过
作者与仓库一致
注册名称已通过 GitHub 账户 aicrafted 验证,该账户拥有此仓库
- … 尚未检查
仍在维护
我们还没有从 GitHub 读取这个仓库
- … 尚未检查
有许可证
我们还没有从 GitHub 读取这个仓库
- – 不适用
端点有响应
它在你的电脑上运行,没有互联网端点
- – 不适用
使用 OAuth 登录
在你的电脑上运行,改用本地设置
- … 尚未检查
工具描述中没有隐藏指令
它在你的电脑上运行;我们只能读取互联网端点的工具列表
与“搜索与 AI 记忆”中的其他服务器比较i
- 星标数多于此分类中其他 5828 个服务器的 0%
- 发布到注册中心的时间比此分类中其他 5828 个服务器的 6% 更新
- 基础检查结果等于或优于此分类中其他 5828 个服务器的 100%
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
常见问题
Searxng MCP 安全吗?
它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。
它需要哪些密钥或代码?
你需要填写:SEARXNG_URL
它在我的电脑上运行还是在云端?
它在你的电脑上运行。你的 AI 应用会在需要时启动它,数据不会经过作者的服务器(除非它自己调用在线服务)。
它还在维护吗?
GitHub 仓库最后更新于–,最新版本(1.0.0)于8个月前进入注册中心。
哪些应用可以使用它?
支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。你的电脑上还需要有 Docker。
有什么可以替代它?
同一分类中有:Context7, Codebase Memory, Exa
替代选择
同一分类中其他作者的服务器,按星标数排序。
如何看卡片:↓ 每周下载量i★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i
Codebase Memory
Codebase knowledge graph for AI agents — 162 languages, sub-ms queries, 99% fewer tokens.
Exa
Connect AI agents to Exa for web search, content fetching, and multi-step research.
作者的 README
打开 README
按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。
SearXNG MCP Server
A Model Context Protocol (MCP) server that provides web search capabilities by integrating with a SearXNG instance.
Features
- Web Search: Perform powerful aggregated searches across multiple engines.
- Discovery: Programmatically retrieve available categories and engines.
- Stateless HTTP: Compatible with any standard JSON-RPC client.
- Flexible Configuration: Supports environment variables and command-line arguments.
Example of compose.yml to run SearXNG with MCP server
services:
searxng: image: searxng/searxng:latest ports:
- "${SEARXNG_PORT:-8080}:8080" volumes:
- "${SEARXNG_VOL_CONFIG:-searxng-config}:/etc/searxng/"
- "${SEARXNG_VOL_DATA:-searxng-data}:/var/cache/searxng/" restart: always
searxng-mcp: image: ghcr.io/aicrafted/searxng-mcp:latest restart: unless-stopped depends_on:
Ensure SearXNG starts before the MCP server
- searxng environment: SEARXNG_URL: "${SEARXNG_URL:-http://searxng:8080}" MCP_HOST: "${MCP_HOST:-127.0.0.1}" MCP_PORT: "${MCP_PORT:-32123}" MCP_TRANSPORT: "${MCP_TRANSPORT:-http}" MCP_ALLOWED_HOSTS: "${MCP_ALLOWED_HOSTS:-localhost:*,127.0.0.1:*}" MCP_ALLOWED_ORIGINS: "${MCP_ALLOWED_ORIGINS:-http://localhost:*,http://127.0.0.1:*}" MCP_DISABLE_DNS_REBINDING_PROTECTION: "${MCP_DISABLE_DNS_REBINDING_PROTECTION:-false}" ports:
- "${MCP_PORT:-32123}:${MCP_PORT:-32123}"
volumes: searxng-config: searxng-data:
Important: Enable JSON responses in your SearXNG
settings.yml, otherwise the MCP server cannot read search results:
`yaml
search:
formats:
- html
- json
`
Example .env
# SearXNG url should be visible by the MCP server inside docker, so use internal service port here
SEARXNG_URL=http://searxng:8080
Public SearXNG port
SEARXNG_PORT=8080
Searxng config and data volumes, start with "./" if You want to bind dir instead using volume
SEARXNG_VOL_CONFIG=searxng-config SEARXNG_VOL_DATA=searxng-data
MCP server host, port and transport ("stdio", "sse", "http")
MCP_HOST=127.0.0.1 MCP_PORT=32123 MCP_TRANSPORT=http
MCP DNS rebinding protection (see https://github.com/modelcontextprotocol/python-sdk/issues/1798 for details)
MCP_ALLOWED_HOSTS=localhost:*,127.0.0.1:* MCP_ALLOWED_ORIGINS=http://localhost:*,http://127.0.0.1:*
MCP_DISABLE_DNS_REBINDING_PROTECTION=true
MCP client config
HTTP transport (recommended)
{
"mcpServers": { "searxng": { "type": "http", "url": "http://localhost:32123/mcp" } } }
SSE transport
{
"mcpServers": { "searxng": { "type": "sse", "url": "http://localhost:32123/sse" } } }
Note: SSE transport uses the
/sseendpoint, not/mcp. HTTP transport uses/mcp.
Prerequisites for run from sources
- Python 3.10+
- A running SearXNG instance.
Installation
- Clone the repository and navigate to the directory.
- Install dependencies:
pip install -r requirements.txt
- Set up your
.envfile (optional).
Configuration
The server reads configuration from command-line arguments and environment variables. Command-line arguments override the corresponding defaults used at startup.
| Variable | Default | Description |
|---|---|---|
SEARXNG_URL | http://localhost:8080 | URL of the SearXNG instance. |
SEARXNG_PORT | 8080 | Public host port for the SearXNG container in the compose example. |
SEARXNG_VOL_CONFIG | searxng-config | Docker volume or host path mounted to /etc/searxng/ in the compose example. |
SEARXNG_VOL_DATA | searxng-data | Docker volume or host path mounted to /var/cache/searxng/ in the compose example. |
MCP_HOST | 127.0.0.1 | Host to bind for HTTP/SSE transports. Use 0.0.0.0 in Docker when publishing the port. |
MCP_PORT | 8000 | Port to bind for HTTP/SSE transports. |
MCP_TRANSPORT | stdio | Transport mode: stdio, http, or sse. |
MCP_ALLOWED_HOSTS | SDK defaults for localhost | Comma-separated allowed Host headers for DNS rebinding protection. |
MCP_ALLOWED_ORIGINS | SDK defaults for localhost | Comma-separated allowed Origin headers for DNS rebinding protection. |
MCP_DISABLE_DNS_REBINDING_PROTECTION | false | Set to true to disable the SDK DNS rebinding protection. |
Usage
Run the server using uv or standard python:
python searxng_mcp.py --transport http --port 32123 --searxng http://searx.lan
Run with Docker
- Build the image:
docker build -t searxng-mcp .
- Run the container:
docker run -d \
-p 32123:32123 \ --env-file .env \ --name searxng-mcp \ searxng-mcp
Transport Options
stdio: Standard input/output (default for some MCP clients).http: Stateless HTTP (streamable-http).sse: Server-Sent Events.
DNS Rebinding Protection
Recent versions of the MCP Python SDK validate Host and Origin headers for HTTP/SSE transports to protect local servers from DNS rebinding attacks. If you expose the server through Docker, a reverse proxy, or a custom domain and receive 421 Invalid Host Header, configure the allowlist explicitly:
MCP_ALLOWED_HOSTS=localhost:*,127.0.0.1:*,mcp.example.com:*
MCP_ALLOWED_ORIGINS=http://localhost:*,http://127.0.0.1:*,https://mcp.example.com
For trusted local development or when this validation is handled by another infrastructure layer, you can disable the SDK protection:
MCP_DISABLE_DNS_REBINDING_PROTECTION=true
Use disabling sparingly; setting MCP_ALLOWED_HOSTS and MCP_ALLOWED_ORIGINS is the recommended option.
Search Abilities Guide
SearXNG aggregates results from various sources. This guide outlines the capabilities available through the web_search tool.
Search Categories
Categories help refine your search by content type. Use these in the categories parameter (comma-separated).
| Category | Description |
|---|---|
general | Default web search (Google, Brave, DuckDuckGo, etc.) |
images | Image search results |
videos | Video content from YouTube, Vimeo, etc. |
news | Recent news articles |
map | Geographical and map information |
it | IT-related searches (StackOverflow, GitHub, etc.) |
science | Scientific papers and articles (ArXiv, Google Scholar) |
files | Torrent and file searches |
social_media | Posts and profiles from social platforms |
Supported Engines
SearXNG can query over 130 engines. Configured engines typically include:
- Web: Google, Brave, DuckDuckGo, Qwant, Startpage
- Knowledge: Wikipedia, Wikidata
- Development: GitHub, StackOverflow, PyPI
- Social: Reddit, Twitter/X
Advanced Search Parameters
- `categories`: Filter by specific types (e.g.,
news,it). - `engines`: Force specific engines (e.g.,
google,wikipedia). - `language`: Specify search language (e.g.,
en,es,fr). - `pageno`: Navigate through multiple pages of results.
- `time_range`: Filter by date (
day,month,year). - `safesearch`: Control content filtering (0=None, 1=Moderate, 2=Strict).
Programmatic Discovery
Use the web_search_info tool to dynamically retrieve the list of enabled categories and engines from your instance.
Windows Troubleshooting
localhost not reachable while Docker container is running
Symptom: http://localhost: / returns connection refused or hits the wrong service, but curl from inside the container works fine.
Root cause: WSL2 port relay ghost
WSL2 automatically forwards ports from the Linux VM to the Windows host using wslrelay.exe. When a process inside WSL listens on a port, WSL creates a relay bound to [::1]: (IPv6 loopback) on the Windows side.
When that WSL process stops, wslrelay.exe often does not release the port. The relay entry stays alive as a zombie listener on [::1]: .
Later, when Docker maps a container to the same host port, it binds correctly to 0.0.0.0: — but [::1]: is already taken by the stale relay.
On Windows, localhost resolves to ::1 (IPv6) first. So browser and curl requests to localhost: hit the dead wslrelay.exe entry instead of the Docker container, resulting in a connection error or unexpected response.
Connecting via the explicit IPv4 address 127.0.0.1: bypasses the relay and reaches Docker correctly.
How to diagnose:
# Check what is listening on the port
netstat -ano | findstr :
Identify the processes
Get-Process -Id , | Select-Object Id,Name
If you see two entries for the same port — one owned by com.docker.backend and another by wslrelay — this is the problem.
Workarounds:
| Option | Command | Notes |
|---|---|---|
| Use IPv4 directly | http://127.0.0.1: / | Immediate, no restart needed |
| Restart WSL | wsl --shutdown | Kills all stale relays; WSL restarts on next use |
| Remap Docker port | Change host port in docker run -p or docker-compose.yml | Avoids the conflict entirely |
Permanent fix:
After wsl --shutdown, restart the Docker container. The relay will no longer exist and localhost: will work normally until the same port is reused inside WSL again.
Prevention:
If you regularly run services on the same port both in WSL and in Docker, prefer one of:
- Always use Docker for that service, never WSL directly
- Use different ports for WSL dev and Docker prod instances
- Add
127.0.0.1: :explicit binding indocker-compose.ymlto force IPv4
Related
- WSL2 networking documentation
- WSL GitHub issue tracker: search
wslrelay port leak