mcp开放网络研究
用于网络搜索和内容提取的代理感知模型上下文协议(MCP)服务器。
设计坚固,与各种网络环境兼容,包括使用SOCKS和HTTP代理的网络环境。
特性
- 动态发动机发现:发动机从以下位置动态加载
src/infrastructure/search/目录。添加新引擎只需要一个新的文件夹和文件,而无需修改核心逻辑。 - 多引擎搜索:聚合Bing、DuckDuckGo和Brave的结果。
- 深入研究 (
search_deep):递归研究代理,执行多轮搜索、引文提取和答案合成。 - 短暂下载:使用100MB有界LRU缓存进行深度搜索报告的内存存储,具有10分钟自动过期功能。
- 集中节流:跨优先级引擎的速率限制管理(搜索和分页冷却)。
- 智能提取:可配置的提取工具(
impit)具有两种操作模式:
- 浏览器模式:包括现代浏览器标头(用户代理、客户端提示),以与需要浏览器标准请求的网站兼容。 - 标准模式:对于不需要浏览器式标识的环境,使用最小的HTTP客户端配置文件。
- 结果抽样:可选的基于LLM的过滤,以评估结果相关性。
- 内容提取:网页访问和标记提取工具(
visit_webpage)使用无头浏览器。 - 代理支持:完全支持SOCKS5、HTTPS和HTTP代理。
- 配置:可通过环境变量和CLI参数进行配置。
- 部署:Docker镜像可用于生产和测试。
______________________________________________________________________
学分
该项目包括以下贡献者的工作:
______________________________________________________________________
安装和快速启动
Docker(推荐)
最新稳定版本:
docker pull ghcr.io/rinaldowouterson/mcp-open-webresearch:latest
docker run -p 3000:3000 ghcr.io/rinaldowouterson/mcp-open-webresearch:latest测试/调试映像:
docker pull ghcr.io/rinaldowouterson/mcp-open-webresearch:test本地安装
要在本地运行服务器(例如,在Claude Desktop或Cline中):
\[!注意\] 替换 /absolute/path/to/project 根据您的实际项目路径。配置(mcp_config.json):
{
"mcpServers": {
"open-webresearch": {
"command": "npm",
"args": [
"run",
"start:sampling",
"--silent",
"--prefix",
"/absolute/path/to/project"
],
"headers": {},
"disabled": false
}
}
}远程服务器(流式HTTP)
端点: http://localhost:3000/mcp
配置:
{
"mcpServers": {
"open-webresearch": {
"serverUrl": "http://localhost:3000/mcp",
"headers": {}
}
}
}______________________________________________________________________
客户端配置和超时
深度搜索过程可能需要几分钟才能完成。一些MCP客户端(如Cline和RooCode)的默认超时为60秒,这将导致操作失败。
您必须在客户端设置中配置更高的超时时间。
克莱恩(cline_mcp_settings.json)
添加 "timeout" 参数(秒)。推荐: 1800 (30分钟)。
{
"mcpServers": {
"open-webresearch": {
"disabled": false,
"timeout": 1800,
"type": "stdio",
"command": "npm",
"args": [
"run",
"start:sampling",
"--silent",
"--prefix",
"/absolute/path/to/mcp-open-webresearch"
],
"autoApprove": []
}
}
}房间代码(mcp_settings.json)
RooCode也尊重 timeout 参数。
{
"mcpServers": {
"open-webresearch": {
"disabled": false,
"timeout": 1800,
"command": "npm",
"args": [
"run",
"start:sampling",
"--silent",
"--prefix",
"/absolute/path/to/mcp-open-webresearch"
],
"alwaysAllow": []
}
}
}反重力/风帆(mcp_config.json)
Antigravity/Windsurf本机处理长时间运行的工具,但如果它们允许您配置超时,最好这样做。
{
"mcpServers": {
"open-webresearch": {
"command": "npm",
"args": [
"run",
"start:sampling",
"--silent",
"--prefix",
"/absolute/path/to/mcp-open-webresearch"
],
"disabled": false
}
}
}______________________________________________________________________
开发者指南:添加新引擎
要添加新的搜索引擎,请执行以下操作:
- 创建目录:
src/infrastructure/search/{engine_name}/
- 实施逻辑:创建
{engine_name}.ts使用获取/解析逻辑。
- 导出接口:创建
index.ts导出SearchEngine接口:
import type { SearchEngine } from "../../../types/search.js";
import { searchMyEngine } from "./my_engine.js";
import { isThrottled } from "../../throttle.js"; // Optional
export const engine: SearchEngine = {
name: "my_engine",
search: searchMyEngine,
isRateLimited: () => isThrottled("my_engine"),
};- 重启:服务器将自动发现并加载新引擎。
______________________________________________________________________
构建并运行
本地地
# 1. Clone
git clone https://github.com/rinaldowouterson/mcp-open-webresearch.git
cd mcp-open-webresearch
# 2. Install
npm install
# 3. Build & Start
npm run build
npm start码头工人
# Production
docker build -t mcp-websearch .
docker run -p 3000:3000 mcp-websearch
# Testing
npm run test:docker______________________________________________________________________
测试
单元和E2E测试
用途 维测试 用于测试。包括对所有发现的发动机进行动态合同测试。
npm test符合性测试
使用本地模拟服务器验证“智能获取”行为(User-Agent标头)的使用情况。
npm run test .test/engines/smart_fetch_mode.test.ts基础设施验证
验证Docker镜像构建和基本功能。
npm run test:infrastructure______________________________________________________________________
可用脚本
| 命令 | 描述 |
|---|---|
npm run build | 将TypeScript编译为 build/ 文件夹。 |
npm run watch | 重新推荐文件更改。 |
npm run inspector | 启动MCP检查器UI。 |
npm start | 运行已编译的服务器。 |
npm test | 运行本地测试。 |
npm run test:docker | 在Docker容器中运行测试。 |
npm run test:infrastructure | 验证docker镜像。 |
npm run generate-certs | 生成用于测试的自签名证书。 |
______________________________________________________________________
配置
配置是通过环境变量或CLI参数进行管理的。
| 变量 | 默认值 | 描述 |
|---|---|---|
PORT | 3000 | 服务器端口 |
PUBLIC_URL | http://localhost:port | 下载链接的公共URL。 |
ENABLE_CORS | false | 启用CORS。 |
CORS_ORIGIN | * | 允许的CORS来源。 |
DEFAULT_SEARCH_ENGINES | bing,duckduckgo,brave | 默认引擎列表。 |
ENABLE_PROXY | false | 启用代理支持。 |
HTTP_PROXY | - | HTTP代理URL |
HTTPS_PROXY | - | HTTPS代理URL |
SOCKS5_PROXY | - | SOCKS5代理URL(最高优先级)。 |
SAMPLING | false | 启用结果采样。 |
SKIP_IDE_SAMPLING | false | 首选外部API而不是IDE。 |
LLM_BASE_URL | - | 外部LLM API基础URL |
LLM_API_KEY | - | 外部LLM API密钥。 |
LLM_NAME | - | 外部LLM模型名称。 |
LLM_TIMEOUT_MS | 30000 | 外部LLM调用超时。 |
DEEP_SEARCH_MAX_LOOPS | 20 | 最大研究迭代次数。 |
DEEP_SEARCH_RESULTS_PER_ENGINE | 5 | 每台发动机每轮的结果。 |
DEEP_SEARCH_SATURATION_THRESHOLD | 0.6 | 提前停止研究的门槛。 |
DEEP_SEARCH_MAX_CITATION_URLS | 10 | 引用时可访问的最大URL数。 |
DEEP_SEARCH_REPORT_RETENTION_MINUTES | 10 | 下载过期时间(分钟)。 |
WRITE_DEBUG_TERMINAL | false | 将调试输出记录到stdout。 |
WRITE_DEBUG_FILE | false | 将调试输出记录到文件中。 |
CLI参数
CLI参数覆盖环境变量。
| 参数 | 描述 |
|---|---|
--port | 要收听的端口 |
--debug | 启用调试日志记录(stdout)。 |
--debug-file | 启用调试日志记录(文件)。 |
--cors | 启用CORS。 |
--proxy | 代理URL(http、https、socks5)。 |
--engines | 以逗号分隔的引擎列表。 |
--sampling | 启用采样。 |
--no-sampling | 禁用采样。 |
______________________________________________________________________
搜索管道和评分
服务器使用多阶段管道来聚合和优化搜索结果:
1.多引擎检索
并发请求被发送到所有配置的引擎(Bing、Brave、DuckDuckGo)。原始结果收集到一个池中。
2.共识评分和重复数据删除
结果按其规范URL(协议/www无关哈希)分组。
- 去重:同一URL的多个条目被合并。
- 评分A.
consensusScore为每个唯一的URL计算:
- 倒排和:各引擎的反向排名之和($1/rank$)。位置越高,得分越高。 - 发动机增压:将总和乘以标识URL的唯一引擎的数量。这将优先考虑多提供商协议。
- 排序:最终列表按计算结果排序
consensusScore按降序排列。
3.LLM采样(可选)
如果 SAMPLING=true,将排名靠前的结果发送给LLM,以评估与查询的语义相关性。
- 过滤:采样充当二进制过滤器。它删除了被确定为不相关的结果(垃圾邮件、离题)。
- 最后一组:保留原始共识得分。只有列表的组成发生了变化。
______________________________________________________________________
LLM抽样策略
启用采样后,服务器将遵循分层解析逻辑来选择要使用的LLM:
| SKIP_IDE_SAMPLING | IDE可用 | 已配置API | 分辨率 |
|---|---|---|---|
false (默认) | ✅ | ✅ | IDE采样 |
true | ✅ | ❌ | IDE采样 |
false | ❌ | ✅ | 外部API |
true | ✅ 或❌ | ✅ | 外部API |
false 或 true | ❌ | ❌ | 无采样 |
\[!提示\] 您可以使用没有API密钥的模型 LLM_API_KEY 值是可选的。\[!重要\] 深度搜索兼容性:The search_deep 该工具严格要求LLM功能(通过IDE或API)。如果两者都不可用,该工具将出现在MCP列表中,但在执行时会抛出错误。______________________________________________________________________
工具文档
search_deep
用于深入调查的递归研究代理。搜索多个来源,提取引文,并综合一个全面的答案。
需要LLM采样功能。
输入:
{
"objective": "Deep research goal",
"max_loops": 3,
"results_per_engine": 5,
"max_citation_urls": 10,
"engines": ["bing", "brave"],
"attach_context": false
}输出: 包含参考列表的结构化Markdown报告。如果已配置,a 下载URL 在输出的顶部允许将结果作为文件下载。
search_web
跨配置的引擎执行搜索。
输入:
{
"query": "search query",
"max_results": 10,
"engines": ["bing", "brave"],
"sampling": true
}visit_webpage
访问URL并返回标记内容。
输入:
{
"url": "https://example.com/article",
"capture_screenshot": false
}set_engines
更新默认搜索引擎。
输入:
{
"engines": ["duckduckgo", "brave"]
}get_engines
返回已配置的搜索引擎。
set_sampling
启用或禁用结果采样。
输入:
{
"enabled": true
}get_sampling
返回当前采样状态。
______________________________________________________________________
📥 短暂下载
深度搜索结果通过内存缓冲区缓存提供。
- 存储:报告存储为
BufferC++堆中的对象,以避免V8字符串内存限制。 - 过期:每个条目都会完全过期 10分钟 创作之后。访问操作(
get)做 不 延长生存时间(TTL)。 - 内存安全:缓存受 100MB天花板当达到限制时,最近最少使用(LRU)驱逐策略会删除最旧的条目。
- URL配置:链接生成取决于
PUBLIC_URL变量,以确保在代理环境中可访问的下载端点。
______________________________________________________________________
路线图
- \[x\] 深度搜索:递归研究和综合引擎。
- \[ \] 无密钥GitHub适配器:实现GitHub内容访问适配器。
______________________________________________________________________
许可证
Apache许可证2.0。看 许可证.
