Web Search MCP

Web Search MCP

A high-performance search service that converts results from Google, Bing, and DuckDuckGo into structured JSON or Markdown. It features multi-layer depth crawling and uses the Camoufox anti-detection browser for reliable content extraction and fallback search logic.

Category
访问服务器

README

Web Search MCP

基于 Camoufox + FastAPI 的高性能 Web 搜索服务,将搜索引擎结果转换为结构化 JSON / Markdown 输出。支持多层深度抓取与并发执行。

功能特性

  • 三大搜索引擎:Google、Bing、DuckDuckGo
  • 多层深度抓取:SERP 解析 → 正文提取 → 外链抓取
  • 双格式输出:JSON / Markdown
  • 反检测浏览器:Camoufox 真实浏览器指纹(geoip、humanize、locale)
  • 并发执行:浏览器池 + asyncio 信号量控制
  • 引擎自动回退:主引擎无结果时自动切换备选引擎

搜索深度

depth 行为 说明
1 SERP 解析 默认。提取标题、链接、摘要
2 SERP + 正文 进入每个结果链接,提取页面正文
3 SERP + 正文 + 外链 继续抓取正文中的外部链接内容

快速开始

安装

# 克隆项目
git clone <repo-url> && cd web-search-mcp

# 安装依赖
pip install -e ".[dev]"

# 安装 Camoufox 浏览器
python -m camoufox fetch

启动服务

# 开发模式(自动重载)
uvicorn src.main:app --reload --port 8000

# 生产模式
uvicorn src.main:app --host 0.0.0.0 --port 8000

服务启动后访问 http://localhost:8000/health 确认状态:

curl http://localhost:8000/health
# {"status":"ok","pool_ready":true}

API 使用

GET /search

# 基础搜索(默认 Google,depth=1,JSON 格式)
curl 'http://localhost:8000/search?q=python+asyncio'

# 指定引擎 + 深度
curl 'http://localhost:8000/search?q=firsh.me+blog&engine=duckduckgo&depth=2&max_results=3'

# Markdown 格式输出
curl 'http://localhost:8000/search?q=firsh.me+blog&engine=duckduckgo&format=markdown'

# Bing 搜索
curl 'http://localhost:8000/search?q=fastapi+tutorial&engine=bing&max_results=5'

# 三层深度抓取(SERP + 正文 + 外链)
curl 'http://localhost:8000/search?q=web+scraping&engine=duckduckgo&depth=3&max_results=3'

参数说明:

参数 类型 默认值 说明
q string 必填 搜索关键词(1-500 字符)
engine string google 搜索引擎:google / bing / duckduckgo
depth int 1 抓取深度:1-3
format string json 输出格式:json / markdown
max_results int 10 最大结果数(1-50)
timeout int 30 超时秒数(5-120)

POST /search

curl -X POST http://localhost:8000/search \
  -H 'Content-Type: application/json' \
  -d '{
    "query": "firsh.me blog",
    "engine": "duckduckgo",
    "depth": 2,
    "format": "json",
    "max_results": 5,
    "timeout": 30
  }'

响应示例

JSON 格式(depth=1):

{
  "query": "firsh.me blog",
  "engine": "duckduckgo",
  "depth": 1,
  "total": 3,
  "results": [
    {
      "title": "NeoJ's Web Page [下水鱼的Blog]",
      "url": "https://firsh.me/",
      "snippet": "这是一个关于下水鱼的个人网站的博客页面。",
      "content": "",
      "sub_links": []
    }
  ],
  "metadata": {
    "elapsed_ms": 2824,
    "timestamp": "2026-02-10T17:02:20.891421+00:00",
    "engine": "duckduckgo",
    "depth": 1
  }
}

JSON 格式(depth=2,包含正文内容):

{
  "query": "firsh.me blog",
  "engine": "duckduckgo",
  "depth": 2,
  "total": 3,
  "results": [
    {
      "title": "NeoJ's Web Page [下水鱼的Blog]",
      "url": "https://firsh.me/",
      "snippet": "这是一个关于下水鱼的个人网站的博客页面。",
      "content": "blog/2026\n2026-02-02\n关闭Chrome 自动更新...",
      "sub_links": []
    }
  ],
  "metadata": {
    "elapsed_ms": 5224,
    "timestamp": "2026-02-10T17:06:36.644148+00:00",
    "engine": "duckduckgo",
    "depth": 2
  }
}

Markdown 格式:

# Search Results: firsh.me blog

**Engine:** duckduckgo | **Depth:** 1 | **Results:** 3
**Time:** 1792ms

---

## 1. NeoJ's Web Page [下水鱼的Blog]
**URL:** https://firsh.me/

> 这是一个关于下水鱼的个人网站的博客页面。

引擎状态

引擎 状态 说明
DuckDuckGo 稳定可用 推荐使用,搜索质量高,无地域限制
Google 受限 部分 IP 会触发验证码,自动回退到 DuckDuckGo
Bing 可用 使用 global.bing.com 避免地域重定向,部分 IP 结果相关性较低

Google 被拦截时会自动按 DuckDuckGo → Bing 顺序回退,响应中的 engine 字段标识实际使用的引擎。

MCP 模式使用(curl 调用示例)

MCP 服务默认监听 http://127.0.0.1:8897,使用 Streamable HTTP 传输协议。

启动 MCP 服务

# 本地启动(HTTP 模式)
python -m src.mcp_server --transport http --host 127.0.0.1 --port 8897

# Docker 启动
docker compose up -d

初始化 MCP 会话

# 发送 initialize 请求
curl -s -X POST http://127.0.0.1:8897/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "initialize",
    "params": {
      "protocolVersion": "2025-03-26",
      "capabilities": {},
      "clientInfo": {"name": "curl-demo", "version": "1.0"}
    }
  }' | jq .

调用 web_search 工具

# 搜索(depth=1,快速 SERP 结果)
curl -s -X POST http://127.0.0.1:8897/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{
    "jsonrpc": "2.0",
    "id": 2,
    "method": "tools/call",
    "params": {
      "name": "web_search",
      "arguments": {
        "query": "firsh.me",
        "engine": "duckduckgo",
        "max_results": 5,
        "depth": 1
      }
    }
  }' | jq .

# 搜索(depth=2,包含页面正文内容)
curl -s -X POST http://127.0.0.1:8897/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{
    "jsonrpc": "2.0",
    "id": 3,
    "method": "tools/call",
    "params": {
      "name": "web_search",
      "arguments": {
        "query": "python asyncio tutorial",
        "engine": "google",
        "max_results": 3,
        "depth": 2
      }
    }
  }' | jq .

调用 get_page_content 工具

# 获取单个页面内容
curl -s -X POST http://127.0.0.1:8897/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{
    "jsonrpc": "2.0",
    "id": 4,
    "method": "tools/call",
    "params": {
      "name": "get_page_content",
      "arguments": {
        "url": "https://firsh.me/"
      }
    }
  }' | jq .

列出可用搜索引擎

curl -s -X POST http://127.0.0.1:8897/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{
    "jsonrpc": "2.0",
    "id": 5,
    "method": "tools/call",
    "params": {
      "name": "list_search_engines",
      "arguments": {}
    }
  }' | jq .

带 API Key 认证

# 如果配置了 API Key 认证,在请求头中添加 Authorization
curl -s -X POST http://127.0.0.1:8897/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -d '{
    "jsonrpc": "2.0",
    "id": 2,
    "method": "tools/call",
    "params": {
      "name": "web_search",
      "arguments": {"query": "hello world", "engine": "duckduckgo"}
    }
  }' | jq .

Camoufox 指纹浏览器配置

通过环境变量配置 Camoufox 高级功能:

环境变量 说明 示例
BROWSER_POOL_SIZE 浏览器并发数 5
BROWSER_PROXY 代理服务器 socks5://127.0.0.1:1080
BROWSER_OS 目标 OS 指纹 windows / macos / linux
BROWSER_FONTS 自定义字体列表 Arial,Helvetica,Times New Roman
BROWSER_BLOCK_WEBGL 阻止 WebGL 指纹 true
BROWSER_ADDONS Firefox 插件路径 /path/to/addon1.xpi,/path/to/addon2.xpi

内置功能(默认启用):

  • GeoIP 伪装 — 基于真实 IP 自动匹配地理位置指纹
  • 人性化操作 — 模拟真实鼠标移动和点击行为
  • 图片阻止 — 加速页面加载
  • Locale 匹配 — 浏览器语言与地区一致

测试

# 单元测试(26 个测试)
pytest tests/ -v

# 集成测试(自动启动服务,真实搜索)
python scripts/test_live.py

# 集成测试 - 自定义参数
python scripts/test_live.py --query "python asyncio" --engines duckduckgo --max-depth 2

# 集成测试 - 服务已在运行时
python scripts/test_live.py --no-server --engines duckduckgo google --max-depth 3

项目结构

web-search-mcp/
├── src/
│   ├── main.py                 # FastAPI 入口 + 浏览器池生命周期
│   ├── config.py               # 配置管理(BrowserConfig / AppConfig)
│   ├── api/
│   │   ├── routes.py           # API 路由 + 引擎回退逻辑
│   │   └── schemas.py          # Pydantic 请求/响应模型
│   ├── engine/
│   │   ├── base.py             # 搜索引擎抽象基类
│   │   ├── google.py           # Google(含首页预热 + 验证码检测)
│   │   ├── bing.py             # Bing(global.bing.com + URL 解码)
│   │   └── duckduckgo.py       # DuckDuckGo
│   ├── scraper/
│   │   ├── browser.py          # Camoufox 浏览器池
│   │   ├── parser.py           # HTML 内容解析
│   │   └── depth.py            # 多层深度抓取调度
│   └── formatter/
│       ├── json_fmt.py         # JSON 格式化
│       └── markdown_fmt.py     # Markdown 格式化
├── tests/                      # 单元测试
├── scripts/
│   └── test_live.py            # 集成测试脚本
└── pyproject.toml

技术栈

组件 技术
Web 框架 FastAPI + Uvicorn
浏览器引擎 Camoufox(反检测 Firefox,Playwright 驱动)
异步运行时 asyncio + Semaphore 并发控制
HTML 解析 BeautifulSoup4 + lxml
内容转换 markdownify(HTML → Markdown)
数据校验 Pydantic v2

Claude Code

img_1.png

License

MIT

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选