这是一个用于类别感知网络搜索、网站抓取以及日期/时间工具的模型上下文协议(MCP)服务器。设计用于与 SearXNG 和现代 MCP 客户端无缝集成。
构建 Docker 镜像:
docker build -t overtlids/mcp-searxng-enhanced:latest .
运行您的 SearXNG 实例(手动 Docker 运行):
docker run -i --rm --network=host \
-e SEARXNG_ENGINE_API_BASE_URL="http://127.0.0.1:8080/search" \
-e DESIRED_TIMEZONE="America/New_York" \
overtlids/mcp-searxng-enhanced:latest
在这个例子中,SEARXNG_ENGINE_API_BASE_URL 明确设置。DESIRED_TIMEZONE 也明确设置为 America/New_York,这与其默认值相同。如果在 docker run 命令期间未使用 -e 标志提供环境变量,则服务器将自动使用其 Dockerfile 中定义的默认值(参见下表的环境变量)。因此,如果您打算使用 DESIRED_TIMEZONE 的默认值,您可以省略 -e DESIRED_TIMEZONE="America/New_York" 标志。然而,SEARXNG_ENGINE_API_BASE_URL 是关键的,通常需要设置以匹配您特定的 SearXNG 实例地址,如果 Dockerfile 默认值(http://host.docker.internal:8080/search)不合适的话。
关于手动 Docker 运行的注意事项: 此命令独立运行 Docker 容器。如果您使用 MCP 客户端(如 VS Code 中的 Cline)来管理此服务器,客户端将使用其自身配置定义的设置启动自己的容器实例。为了使 MCP 客户端使用特定的环境变量,它们必须在客户端的设置中为此服务器配置(见下文)。
配置您的 MCP 客户端(例如,VS Code 中的 Cline):
为了让您的 MCP 客户端正确管理和运行此服务器,您必须在客户端的设置中定义 overtlids/mcp-searxng-enhanced 服务器的所有必要环境变量。MCP 客户端将使用这些设置来构造 docker run 命令。
以下是此服务器在您的 MCP 客户端 JSON 设置中的推荐默认配置(例如,cline_mcp_settings.json)。此示例明确列出所有环境变量设置为其在 Dockerfile 中定义的默认值。您可以直接复制粘贴此内容,然后根据需要自定义任何值。
{
"mcpServers": {
"overtlids/mcp-searxng-enhanced": {
"command": "docker",
"args": [
"run", "-i", "--rm", "--network=host",
"-e", "SEARXNG_ENGINE_API_BASE_URL=http://host.docker.internal:8080/search",
"-e", "DESIRED_TIMEZONE=America/New_York",
"-e", "ODS_CONFIG_PATH=/config/ods_config.json",
"-e", "RETURNED_SCRAPPED_PAGES_NO=3",
"-e", "SCRAPPED_PAGES_NO=5",
"-e", "PAGE_CONTENT_WORDS_LIMIT=5000",
"-e", "CITATION_LINKS=True",
"-e", "MAX_IMAGE_RESULTS=10",
"-e", "MAX_VIDEO_RESULTS=10",
"-e", "MAX_FILE_RESULTS=5",
"-e", "MAX_MAP_RESULTS=5",
"-e", "MAX_SOCIAL_RESULTS=5",
"-e", "TRAFILATURA_TIMEOUT=1_15",
"-e", "SCRAPING_TIMEOUT=20",
"-e", "CACHE_MAXSIZE=100",
"-e", "CACHE_TTL_MINUTES=5",
"-e", "CACHE_MAX_AGE_MINUTES=30",
"-e", "RATE_LIMIT_REQUESTS_PER_MINUTE=10",
"-e", "RATE_LIMIT_TIMEOUT_SECONDS=60",
"-e", "IGNORED_WEBSITES=",
"overtlids/mcp-searxng-enhanced:latest"
],
"timeout": 60
}
}
}
MCP 客户端配置的关键点:
-e "VARIABLE_NAME=value" 行内的 args 数组中的值即可。例如,要更改 SEARXNG_ENGINE_API_BASE_URL 和 DESIRED_TIMEZONE,您只需调整相应的行。ods_config.json 文件也可以影响设置(参见配置管理),但由 MCP 客户端传递的环境变量优先。如果您希望不使用 Docker 直接使用 Python 运行服务器,请遵循以下步骤:
1. Python 安装:
2. 克隆仓库:
git clone https://github.com/OvertliDS/mcp-searxng-enhanced.git
cd mcp-searxng-enhanced
3. 创建并激活虚拟环境(推荐):
# 对于 Linux/macOS
python3 -m venv .venv
source .venv/bin/activate
# 对于 Windows(命令提示符)
python -m venv .venv
.\.venv\Scripts\activate.bat
# 对于 Windows(PowerShell)
python -m venv .venv
.\.venv\Scripts\Activate.ps1
4. 安装依赖项:
pip install -r requirements.txt
关键依赖项包括 httpx、BeautifulSoup4、pydantic、trafilatura、python-dateutil、cachetools、zoneinfo、filetype、pymupdf 和 pymupdf4llm。5. 确保 SearXNG 可用:
http://127.0.0.1:8080/search)。6. 设置环境变量:
SEARXNG_ENGINE_API_BASE_URL。export SEARXNG_ENGINE_API_BASE_URL="http://your-searxng-instance:port/search"
export DESIRED_TIMEZONE="America/Los_Angeles"
set SEARXNG_ENGINE_API_BASE_URL="http://your-searxng-instance:port/search"
set DESIRED_TIMEZONE="America/Los_Angeles"
$env:SEARXNG_ENGINE_API_BASE_URL="http://your-searxng-instance:port/search"
$env:DESIRED_TIMEZONE="America/Los_Angeles"
ODS_CONFIG_PATH 所指定位置的 ods_config.json 文件中的值。7. 运行服务器:
python mcp_server.py
8. 配置文件(ods_config.json):
ODS_CONFIG_PATH 环境变量指定的路径)创建一个 ods_config.json 文件。环境变量始终优先于此文件中的值。示例:
json { "searxng_engine_api_base_url": "http://127.0.0.1:8080/search", "desired_timezone": "America/New_York" } 以下环境变量控制服务器的行为。您可以在 MCP 客户端的配置中设置它们(推荐用于客户端管理的服务器)或在手动运行 Docker 时设置。
| 变量 | 描述 | 默认值(来自 Dockerfile) | 备注 |
|---|---|---|---|
SEARXNG_ENGINE_API_BASE_URL | SearXNG 搜索端点 | http://host.docker.internal:8080/search | 服务器操作的关键 |
DESIRED_TIMEZONE | 日期/时间工具的时间区域 | America/New_York | 例如,America/Los_Angeles。时区数据库时间区域列表:https://en.wikipedia.org/wiki/List_of_tz_database_time_zones |
ODS_CONFIG_PATH | 持久配置文件的路径 | /config/ods_config.json | 通常在容器内保持默认值。 |
RETURNED_SCRAPPED_PAGES_NO | 每次搜索返回的最大页面数 | 3 | |
SCRAPPED_PAGES_NO | 尝试抓取的最大页面数 | 5 | |
PAGE_CONTENT_WORDS_LIMIT | 每个抓取页面的最大单词数 | 5000 | |
CITATION_LINKS | 启用/禁用引用事件 | True | True 或 False |
MAX_IMAGE_RESULTS | 返回的最大图像结果数 | 10 | |
MAX_VIDEO_RESULTS | 返回的最大视频结果数 | 10 | |
MAX_FILE_RESULTS | 返回的最大文件结果数 | 5 | |
MAX_MAP_RESULTS | 返回的最大地图结果数 | 5 | |
MAX_SOCIAL_RESULTS | 返回的最大社交媒体结果数 | 5 | |
TRAFILATURA_TIMEOUT | 内容提取超时(秒) | 15 | |
SCRAPING_TIMEOUT | HTTP 请求超时(秒) | 20 | |
CACHE_MAXSIZE | 缓存网站的最大数量 | 100 | |
CACHE_TTL_MINUTES | 缓存生存时间(分钟) | 5 | |
CACHE_MAX_AGE_MINUTES | 缓存内容的最大年龄(分钟) | 30 | |
RATE_LIMIT_REQUESTS_PER_MINUTE | 每分钟每个域名的最大请求数 | 10 | |
RATE_LIMIT_TIMEOUT_SECONDS | 速率限制跟踪窗口(秒) | 60 | |
IGNORED_WEBSITES | 忽略的站点的逗号分隔列表 | "" (空) | 例如,"example.com,another.org" |
服务器采用三级配置方法:
ODS_CONFIG_PATH 加载,默认为 /config/ods_config.json)只有在以下情况下才会更新配置文件:
这确保了用户配置在没有新环境变量的情况下,在容器重启之间得以保存。
| 工具名称 | 目的 | 别名 |
|---|---|---|
search_web | 通过 SearXNG 进行网络搜索 | search, web_search, find, lookup_web, search_online, access_internet, lookup* |
get_website | 抓取网站内容 | fetch_url, scrape_page, get, load_website, lookup* |
get_current_datetime | 当前日期/时间 | current_time, get_time, current_date |
*lookup 是上下文敏感的:
url 参数,它映射到 get_websitesearch_web网络搜索
{ "name": "search_web", "arguments": { "query": "开源人工智能" } }
或使用别名:
{ "name": "search", "arguments": { "query": "开源人工智能" } }
类别特定搜索
{ "name": "search_web", "arguments": { "query": "风景", "category": "images" } }
网站抓取
{ "name": "get_website", "arguments": { "url": "example.com" } }
或使用别名:
{ "name": "lookup", "arguments": { "url": "example.com" } }
当前日期/时间
{ "name": "get_current_datetime", "arguments": {} }
或:
{ "name": "current_time", "arguments": {} }
search_web 工具支持不同类别并具有定制输出:
抓取 Reddit 内容时,URL 自动转换为使用旧版 reddit.com 域以获得更好的内容提取。
基于域名的速率限制防止同一域名在一段时间内过多请求。这可以防止目标网站被淹没和潜在的 IP 封锁。
缓存的网站内容会根据其年龄自动验证新鲜度。过期的内容会自动刷新,而有效的缓存内容会被快速提供。
服务器实现了一个强大的错误处理系统,具有以下异常类型:
MCPServerError: 所有服务器错误的基础异常类ConfigurationError: 当配置值无效时抛出SearXNGConnectionError: 当连接到 SearXNG 失败时抛出WebScrapingError: 当网络抓取失败时抛出RateLimitExceededError: 当域名的速率限制超出时抛出错误会以具有信息性的消息传播到客户端。
SEARXNG_ENGINE_API_BASE_URL 环境变量指向正确的端点。RATE_LIMIT_REQUESTS_PER_MINUTE。TRAFILATURA_TIMEOUT 以允许更长时间处理复杂页面。host.docker.internal 应解析为主机机器。在 Linux 上,您可能需要使用主机的 IP 地址。灵感来源于: