跳至正文
来两杯美式
返回

自建 SearXNG + MCP:给 AI 工具接入可控的网页搜索

By 来两杯美式
发布于更新于

AI 编程工具可以通过 MCP 调用搜索,但常见方案往往要求搜索服务的 API Key。若你希望控制自己的搜索入口,可以自建 SearXNG,再用 mcp-searxng 将它接入 MCP 客户端。

这不是“免费且匿名的 Google API”。SearXNG 会把查询转发给你启用的上游搜索引擎;自建的价值在于不必把查询先交给公共 SearXNG 实例运营者,并可控制引擎、日志、网络出口和访问范围。服务器、带宽和代理仍可能产生成本,上游引擎也可能限流或要求 API Key。

本文已按 2026 年 8 月的上游文档修订。旧的 searxng-docker 仓库已经归档;新部署请使用 SearXNG 主仓库提供的 Compose 模板。

架构与前提

AI 客户端(Claude Code / Cursor / VS Code 等)
                 │ MCP(stdio)

         mcp-searxng(本机 Node.js 进程)
                 │ HTTP + JSON

       SearXNG(由你控制的实例)


       你启用的上游搜索引擎

你需要 Docker Compose、Node.js 20 或更高版本,以及一个支持 stdio MCP 的客户端。下文假设 SearXNG 与 MCP 客户端运行在同一台机器;如果 SearXNG 位于远程服务器,请将示例中的 http://localhost:8080 替换为该实例的 HTTPS 地址。

第一步:用官方 Compose 模板部署 SearXNG

创建目录并下载当前模板:

mkdir -p searxng/core-config
cd searxng

curl -fsSLO https://raw.githubusercontent.com/searxng/searxng/master/container/docker-compose.yml
curl -fsSLO https://raw.githubusercontent.com/searxng/searxng/master/container/.env.example
cp .env.example .env

请先阅读生成的 .env,只修改其中已有且确实需要的变量。模板会随版本演进,不应再沿用旧教程里的 SEARXNG_HOSTNAME、Caddyfile 或 Redis 容器配置。

core-config/settings.yml 中放入最小配置:

use_default_settings: true

server:
  # 用 openssl rand -hex 32 生成,绝不要提交到仓库
  secret_key: "替换为随机字符串"
  # 个人本机实例可关闭;公开服务应启用 limiter 并配好 Valkey
  limiter: false
  # 非必要不代理图片,减少请求和资源消耗
  image_proxy: false

search:
  default_lang: "zh-CN"
  formats:
    - html
    - json

json 是本方案的关键:mcp-searxng 通过 SearXNG 的 JSON 搜索 API 查询结果。不要把随机 secret_key 写成示例值,也不要将配置文件提交到公开仓库。

启动服务:

docker compose up -d
docker compose ps

官方 Compose 示例默认会把服务发布到 8080。先在浏览器打开 http://localhost:8080,再验证 JSON API:

curl 'http://localhost:8080/search?q=hello+world&format=json'

若返回 403,通常是 search.formats 未包含 json、配置文件未被挂载,或 YAML 缩进有误。修改后重启服务:

docker compose restart core

引擎、API Key 与限流

use_default_settings: true 会使用 SearXNG 的默认引擎集合。先用默认配置验证,再按需调整 engines,不要从教程复制一份过时的完整引擎列表。

特别注意:并非所有引擎都免 Key。例如 SearXNG 的 Brave API 引擎需要 api_key;不要在没有 Key 的情况下启用它,更不能据此宣称整套方案“不需要任何 API Key”。直接抓取搜索结果的引擎也可能触发验证码、429 或临时禁用。

限制 SearXNG 到上游引擎的连接,应使用 outgoing 配置,而不是 server.max_connections

outgoing:
  request_timeout: 5.0
  pool_connections: 20
  pool_maxsize: 5

上游访问需要经由代理时,也应配置在 SearXNG 的 outgoing.proxies,因为真正请求 Google、Bing 等的是 SearXNG,不是 MCP 进程。

outgoing:
  proxies:
    all://:
      - http://proxy.example:8080

不要把代理地址、密码或 API Key 写入 Git。公开部署还应设置 HTTPS、反向代理、访问认证和限流;仅打开 JSON API 并不等于访问控制。

第二步:配置 mcp-searxng

mcp-searxng 是独立的 Node.js MCP Server。最简单的方式是让客户端通过 npx 启动:

{
  "mcpServers": {
    "searxng": {
      "command": "npx",
      "args": ["-y", "mcp-searxng"],
      "env": {
        "SEARXNG_URL": "http://localhost:8080"
      }
    }
  }
}

首次运行会下载包。生产或团队环境建议固定已验证的包版本,而不是长期使用浮动的最新版。

SearXNG 由反向代理保护为 HTTP Basic Auth 时,可把已百分号编码的凭据嵌入 SEARXNG_URL

{
  "env": {
    "SEARXNG_URL": "https://username:password@search.example.com"
  }
}

不要把包含凭据的 JSON 提交进版本库。AUTH_USERNAMEAUTH_PASSWORD 仍是兼容旧配置的后备变量,但 URL 内凭据更适合多实例分别认证。

配置多个可互换实例时可用分号分隔;默认按顺序故障转移:

{
  "env": {
    "SEARXNG_URL": "https://one.example.com;https://two.example.com"
  }
}

只有这些实例确实提供相同能力时,才使用 SEARXNG_FANOUT=true 并行搜索和合并结果;否则不同索引、语言或引擎配置会让结果难以解释。

第三步:接入客户端

Claude Code

claude mcp add searxng -s user -e SEARXNG_URL=http://localhost:8080 -- npx -y mcp-searxng

-s user 使配置对当前用户的项目生效。执行 claude mcp list 检查是否已被识别。

Cursor 与 Claude Desktop

Cursor 使用项目目录下的 .cursor/mcp.json;Claude Desktop 使用 claude_desktop_config.json。两者的 stdio 配置均可使用上一节的 mcpServers JSON。保存后重启客户端,并在 MCP 面板确认服务已连接。

VS Code

在工作区新建或编辑 .vscode/mcp.json,但 VS Code 的顶层键是 servers

{
  "servers": {
    "searxng": {
      "command": "npx",
      "args": ["-y", "mcp-searxng"],
      "env": {
        "SEARXNG_URL": "http://localhost:8080"
      }
    }
  }
}

Cline 有自己的 MCP 配置入口,不应假定会读取 .vscode/mcp.json。请在其设置中添加同一份 stdio Server 定义。

能力与验证方式

当前 mcp-searxng 暴露的核心工具是:

新闻、图片、视频、学术搜索不是独立的 MCP 工具名;应由 searxng_web_searchcategories 和实例中真实启用的引擎决定。配置完成后,先调用 searxng_instance_info,再发起一次普通网页搜索,确认返回的引擎和结果符合预期。

网页读取、FlareSolverr 与安全边界

web_url_read 会把外部网页内容带回模型上下文。网页内容不可信:它可能包含提示词注入、虚假指令、敏感信息诱导或恶意链接。把搜索结果当作资料,而不是系统指令;不要让模型因网页文字泄露密钥、绕过审批,或执行未经确认的命令。

对于 JavaScript 重、挑战页或验证码页,可以选择部署受信任的 FlareSolverr,并为 MCP 进程设置正确变量:

{
  "env": {
    "SEARXNG_URL": "http://localhost:8080",
    "FLARESOLVERR_URL": "http://flaresolverr:8191"
  }
}

它不是保证绕过所有反爬的工具。配置后,待读取 URL 会被交给该浏览器服务处理;因此应将其置于私有容器网络、不要映射 8191 到公网,并限制它访问内网和云元数据地址。没有明确的合规授权时,不要用它规避网站的访问控制或服务条款。

总结

这套方案适合需要可控搜索入口的个人或小团队:使用官方 SearXNG Compose 模板,开启 JSON 格式,再将 mcp-searxng 作为 stdio MCP Server 接入客户端。它减少了对公共聚合服务的依赖,但不会消除上游搜索引擎、基础设施成本、访问条款、隐私和提示词注入风险。

上线前请至少检查:实例未意外暴露公网;JSON API 的访问范围符合预期;secret_key、认证信息和代理凭据未提交;启用的搜索引擎确实可用;以及客户端仅信任来自可信来源的 MCP Server。

参考


分享这篇文章:
通过邮件分享这篇文章✓ 链接已复制
查看系列全部文章
  1. 01.MCP Server 选型决策树:从语言到审计,六个维度一次说清
  2. 02.当 MCP Server 只是"翻译"现成能力:FastMCP + Mem0 + Redis 的选型逻辑
  3. 03.当 MCP Server 要"嵌进"对外平台:Node.js + 官方 SDK + API Key 的选型逻辑
  4. 04.SSE 已被 MCP 判为 legacy:存量服务怎么迁、新服务怎么选
  5. 05.MCP 权限怎么分级?只读、可操作和高风险动作(附完整源码)
  6. 06.MCP 工具权限码怎么设计?read、write、dangerous 三层模型(附完整源码)
  7. 07.自建 SearXNG + MCP:给 AI 工具接入可控的网页搜索
  8. 08.Agent Skill 是快照,快照会腐烂:我把业务流程全部搬到了服务端
  9. 09.能力目录与协议下发:把接口设计和控制流一起交给 Agent
  10. 10.四套版本号:把 Agent Skill 的版本管理挪回服务端之后
  11. 11.让用户自定义 Agent 能力,而不打开注入的后门
  12. 12.MCP 2026-07-28 改了什么:从有状态会话到无状态核心
  13. 13.Anthropic 发布 Agent Skills:AI Agent 的能力该如何被打包
  14. 14.Agent Skills 设计模式:用文件夹给 Agent 装上专业能力
  15. 15.Agent Skills 最佳实践:从评测、结构拆分到安全审查
  16. 16.MCP Server 升级 2026-07-28:不是换依赖,而是重画协议边界
  17. 17.MCP Client 升级 2026-07-28:服务端能留兼容窗口,我们偏不兼容旧协议
  18. 18.MCP 爆炸之后,Agent 怎么从一堆工具里选对那一个

上一篇
Git 知识系列(七):Submodule 操作指南
下一篇
SSE 已被 MCP 判为 legacy:存量服务怎么迁、新服务怎么选