网络搜索MCP
通过以下方式为LLM客户提供高性能网络搜索服务 模型上下文协议由迷彩隐形浏览器提供支持。
______________________________________________________________________
______________________________________________________________________
特性
- 3搜索引擎 --谷歌、必应、DuckDuckGo自动回退
- 多深度刮削 --SERP解析→ 全文提取→ 出站链接爬行
- 隐形浏览器 — 迷彩 反检测Firefox(GeoIP、人性化、区域设置)
- 自动缩放池 --浏览器池以80%的利用率自动扩展,可配置上限
- 管理员仪表板 -搜索分析、系统监控、API密钥管理、IP禁止
- API密钥认证 --内置密钥生成(
wsm_前缀),带有呼叫限制和撤销 - 双输出 --JSON和Markdown格式
- REST API -标准HTTP API和MCP协议
快速开始
Docker(推荐)
git clone https://github.com/nicepkg/web-search-mcp.git
cd web-search-mcp
# Configure
cp .env.example .env
# Edit .env — set ADMIN_TOKEN
# Launch
docker compose up -d
# Verify
curl http://127.0.0.1:8897/health创建API密钥并注册到Claude代码
# 1. Create an API key via Admin API
curl -X POST http://127.0.0.1:8897/admin/api/keys \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "claude-code", "call_limit": 10000}'
# Save the returned wsm_xxx key (only shown once)
# 2. Register MCP to Claude Code
claude mcp add-json -s user web-search-fast '{
"type": "http",
"url": "http://127.0.0.1:8897/mcp",
"headers": {"Authorization": "Bearer wsm_your-api-key-here"}
}'
# 3. Restart Claude Code session或使用管理员仪表板 http://127.0.0.1:8897/admin 以视觉方式创建密钥。
MCP工具
| 工具 | 描述 | 超时 |
|---|---|---|
web_search | 搜索网页,返回Markdown结果 | 25s |
get_page_content | 从URL中提取内容 | 20s |
list_search_engines | 列出可用引擎和池状态 | -- |
web_search参数
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
query | string | 必填 | 搜索关键字 |
engine | 字符串 | duckduckgo | google / bing / duckduckgo |
depth | int | 1 | 1=仅SERP,2=SERP+内容,3=SERP=内容+外接 |
max_results | int | 5 | 最大结果(1-20) |
搜索深度
| 深度 | 行为 | 描述 |
|---|---|---|
1 | SERP解析 | 默认值。提取标题、链接、片段 |
2 | SERP+内容 | 导航到每个结果,提取页面内容 |
3 | SERP+内容+输出链接 | 还从内容中抓取输出链接 |
认证模型
| 令牌类型 | 来源 | 访问 |
|---|---|---|
ADMIN_TOKEN | 环境变量 | 管理面板API(超级用户) |
wsm_ API密钥 | 通过管理面板创建 | MCP/搜索API |
ADMIN_TOKEN具有对所有端点的超级用户访问权限wsm_密钥只能访问MCP和搜索端点(不能访问管理员API)- 如果不
ADMIN_TOKEN已设置且不存在API键,所有终结点都处于打开状态
REST API
可与MCP一起提供标准HTTP API。
# GET
curl 'http://127.0.0.1:8897/search?q=python+asyncio&engine=duckduckgo&max_results=5' \
-H 'Authorization: Bearer wsm_your-key'
# POST
curl -X POST http://127.0.0.1:8897/search \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer wsm_your-key' \
-d '{"query": "python asyncio", "engine": "duckduckgo", "depth": 2, "max_results": 5}'| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
q / query | string | 必填 | 搜索关键字(1-500个字符) |
engine | 字符串 | duckduckgo | google / bing / duckduckgo |
depth | int | 1 | 刮削深度:1-3 |
format | 字符串 | json | json / markdown |
max_results | int | 10 | 最大结果(1-50) |
timeout | int | 30 | 超时秒数(5-120) |
管理员仪表板
访问 http://127.0.0.1:8897/admin 并使用登录 ADMIN_TOKEN.
- 仪表盘 --搜索统计数据、CPU/内存监控、浏览器池状态、延迟图表、引擎分布、成功率
- API密钥 --创建/撤销具有呼叫限制的密钥
- IP禁令 --禁止/取消禁止IP地址
- 搜索日志 --使用IP过滤的搜索历史记录
引擎状态
| 发动机 | 状态 | 注释 |
|---|---|---|
| 鸭鸭搜 | 稳定 | 推荐默认HTML精简模式 |
| 谷歌 | 有限 | 可能会在某些IP上触发验证码,自动回退 |
| 必应 | 可用 | 用途 global.bing.com 避免地理重定向 |
当谷歌被屏蔽时,会自动回退:DuckDuckGo→ Bing.
部署
端点
| URL | 描述 |
|---|---|
http://127.0.0.1:8897/mcp | MCP端点(可流式HTTP) |
http://127.0.0.1:8897/health | 健康检查 |
http://127.0.0.1:8897/admin | 管理员仪表板 |
http://127.0.0.1:8897/search | REST API |
反向代理(Nginx)
如果使用HTTPS在Nginx后面部署:
location / {
proxy_pass http://127.0.0.1:8897;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Authorization $http_authorization;
# Required for MCP Streamable HTTP (SSE)
proxy_buffering off;
proxy_cache off;
proxy_http_version 1.1;
proxy_set_header Connection '';
proxy_read_timeout 120s;
proxy_send_timeout 120s;
}Cloudflare用户:为添加WAF异常规则 /mcp 路径,或使用仅DNS模式(灰色云)。环境变量
| 变量 | 默认值 | 描述 |
|---|---|---|
ADMIN_TOKEN | -- | 管理面板身份验证令牌(超级用户) |
BROWSER_POOL_SIZE | 5 | 初始浏览器选项卡计数 |
BROWSER_MAX_POOL_SIZE | 20 | 自动缩放上限 |
BROWSER_PROXY | -- | 代理服务器(socks5/http) |
BROWSER_OS | -- | 目标操作系统指纹(windows/macos/linux) |
BROWSER_FONTS | -- | 自定义字体列表 |
BROWSER_BLOCK_WEBGL | false | 阻止WebGL指纹识别 |
BROWSER_ADDONS | -- | Firefox插件路径 |
MCP_PORT | 8897 | 服务器端口 |
WSM_DB_PATH | wsm.db | SQLite数据库路径 |
REDIS_URL | -- | Redis连接URL(可选) |
发展
# Install dependencies
pip install -e ".[dev]"
# Install Camoufox browser
python -m camoufox fetch
# Start server
python -m src.mcp_server --transport http --host 127.0.0.1 --port 8897
# Run tests (96 tests)
pytest tests/ -v
# Type check
mypy src/
# Lint & format
ruff check src/ --fix && ruff format src/建筑
web-search-mcp/
├── src/
│ ├── mcp_server.py # MCP server entry (FastMCP + middleware + Admin)
│ ├── config.py # Configuration management
│ ├── api/
│ │ ├── routes.py # HTTP API routes
│ │ └── schemas.py # Pydantic request/response models
│ ├── core/
│ │ └── search.py # Search logic (shared by MCP + HTTP)
│ ├── engine/
│ │ ├── base.py # Search engine abstract base class
│ │ ├── google.py # Google (JS DOM + captcha detection)
│ │ ├── bing.py # Bing (global.bing.com)
│ │ └── duckduckgo.py # DuckDuckGo (HTML-lite)
│ ├── scraper/
│ │ ├── browser.py # BrowserPool (auto-scaling + health monitoring)
│ │ ├── parser.py # HTML content parser
│ │ └── depth.py # Multi-depth scraping
│ ├── formatter/
│ │ ├── json_fmt.py # JSON formatter
│ │ └── markdown_fmt.py # Markdown formatter
│ ├── admin/
│ │ ├── database.py # SQLite init + migrations
│ │ ├── repository.py # Data access layer
│ │ ├── routes.py # Admin REST API
│ │ └── static/ # Admin SPA build output
│ └── middleware/
│ ├── api_key_auth.py # Bearer token auth (ADMIN_TOKEN + DB keys)
│ ├── ip_ban.py # IP ban middleware
│ └── search_log.py # Search logging middleware
├── admin-ui/ # Admin frontend (React + Vite + Tailwind)
├── tests/ # Test suite (96 tests)
├── docker-compose.yml
├── Dockerfile
└── pyproject.toml技术栈
| 组件 | 技术 |
|---|---|
| Web框架 | FastAPI+Uvicorn+Starlette |
| MCP框架 | FastMCP(MCP>=1.25.0) |
| 浏览器引擎 | 迷彩(反检测火狐,剧作家) |
| 异步运行时 | 异步+信号量并发控制 |
| HTML解析 | BeautifulSoup4+lxml |
| 内容转换 | markdownify(HTML→ Markdown) |
| 数据库 | SQLite(aiosqlite) |
| 缓存 | Redis(可选) |
| 管理前端 | React+Vite+顺风CSS+插件 |
| 验证 | Pydantic v2 |
______________________________________________________________________
功能特性
- 三大搜索引擎 — Google、Bing、DuckDuckGo,自动回退
- 多层深度抓取 — SERP 解析 → 正文提取 → 外链抓取
- 反检测浏览器 — Camoufox 真实浏览器指纹(GeoIP、Humanize、Locale)
- 自动扩容 — 浏览器池并发达 80% 时自动扩容,上限可配
- Admin 管理面板 — 搜索统计、系统监控、API Key 管理、IP 封禁
- API Key 认证 — 内置密钥生成(
wsm_前缀),支持调用限额和吊销 - 双格式输出 --JSON/Markdown
- REST API — 标准 HTTP API,与 MCP 协议并行提供
快速开始
Docker 部署(推荐)
git clone https://github.com/nicepkg/web-search-mcp.git
cd web-search-mcp
# 配置环境变量
cp .env.example .env
# 编辑 .env,设置 ADMIN_TOKEN
# 启动服务
docker compose up -d
# 验证
curl http://127.0.0.1:8897/health创建 API Key 并注册到 Claude Code
# 1. 通过 Admin API 创建 API Key
curl -X POST http://127.0.0.1:8897/admin/api/keys \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "claude-code", "call_limit": 10000}'
# 保存返回的 wsm_xxx 密钥(仅创建时可见)
# 2. 注册 MCP 到 Claude Code
claude mcp add-json -s user web-search-fast '{
"type": "http",
"url": "http://127.0.0.1:8897/mcp",
"headers": {"Authorization": "Bearer wsm_your-api-key-here"}
}'
# 3. 重启 Claude Code 会话也可以访问 http://127.0.0.1:8897/admin 通过 Admin 面板可视化创建密钥。
本地 stdio 模式
无需 Docker,Claude Code 直接通过 stdin/stdout 通信:
pip install -e .
python -m camoufox fetch
claude mcp add-json -s user web-search-fast '{
"type": "stdio",
"command": "python",
"args": ["-m", "src.mcp_server", "--transport", "stdio"],
"env": {"PYTHONUNBUFFERED": "1"},
"cwd": "'$(pwd)'"
}'认证模型
| Token 类型 | 来源 | 访问范围 |
|---|---|---|
ADMIN_TOKEN | 环境变量 | Admin 面板 API(超级权限) |
wsm_ API Key | Admin 面板创建 | MCP / 搜索 API |
ADMIN_TOKEN拥有所有端点的超级权限wsm_密钥只能访问 MCP 和搜索端点(不能访问 Admin API)- 如果未配置
ADMIN_TOKEN且无 API Key,所有端点开放访问
反向代理注意事项
使用 Nginx 反向代理时,MCP Streamable HTTP 需要关闭缓冲:
proxy_buffering off;
proxy_http_version 1.1;
proxy_set_header Connection '';
proxy_read_timeout 120s;Claude Code 如何默认使用这个工具进行搜索
编辑 ~/.claude/CLAUDE.md 添加下面的内容
## Web Search
* 优先使用 `web-search-fast`
Cloudflare 用户:需要为 /mcp 路径添加 WAF 例外规则,或使用 DNS-only 模式(灰色云朵)。