Web Search MCP Server:本地 LLM 无 API 密钥 Web 搜索
Web Search MCP Server
A Web Search MCP Server is a lightweight, TypeScript‑based MCP (Model Context Protocol) server that gives locally‑hosted LLMs real‑time, on‑premise web‑search capabilities. It eliminates the need for paid APIs by directly connecting to popular search engines—Bing, Brave, and DuckDuckGo—and extracting full page content or lightweight snippets.
为什么使用它?
| Requirement | 为什么重要 |
|---|---|
| No API keys | 许多 LLM 部署避免外部成本和潜在延迟。 |
| Multi‑engine strategy | 在一个引擎失效时回退到备用引擎。 |
| Full page extraction | 拉取整篇文章供高质量上下文使用。 |
| Concurrent processing | 并行检索多个结果,减少总等待时间。 |
| Playwright support | 模拟人类浏览以绕过机器人检测。 |
| Configurable via environment variables | 在不改代码的情况下注整超时、浏览器数量和关联阈值。 |
快速安装
# 1. 克隆仓库
git clone https://github.com/mrkrsl/web-search-mcp.git
cd web-search-mcp
# 2. 安装 Node.js v18+ 和 npm v8+
# (使用官方安装包或 nvm 管理版本。)
# 3. 安装依赖与 Playwright 浏览器
npm install
npx playwright install
# 4. 编译 TypeScript 代码
npm run build
# 5. 运行服务器(开发模式)
npm start # 或 "npm run dev" 热重载
提示:在 Windows 上请将斜杠替换为反斜杠,并使用 PowerShell 命令。
配置
在项目根目录(或你喜欢的任何位置)创建或编辑 mcp.json,告诉 MCP 客户端服务器二进制文件的位置。
{
"mcpServers": {
"web-search": {
"command": "node",
"args": ["/path/to/web-search-mcp/dist/index.js"],
"env": {
"MAX_CONTENT_LENGTH": "10000",
"BROWSER_HEADLESS": "true",
"MAX_BROWSERS": "3",
"BROWSER_FALLBACK_THRESHOLD": "3"
}
}
}
}
command– 通常为node。args–dist/index.js的绝对路径。env– 可选的环境变量,用于精细调优。
常见环境变量
| Variable | Default | 作用 |
|---|---|---|
MAX_CONTENT_LENGTH |
500000 |
从页面提取返回的最大字符数。 |
DEFAULT_TIMEOUT |
6000 |
请求超时,单位毫秒。 |
MAX_BROWSERS |
3 |
最大并发浏览器实例数。 |
BROWSER_TYPES |
chromium,firefox |
启动的浏览器类型。 |
ENABLE_RELEVANCE_CHECKING |
true |
开启搜索质量评分。 |
RELEVANCE_THRESHOLD |
0.3 |
最低质量分数阈值。 |
FORCE_MULTI_ENGINE_SEARCH |
false |
即使单个引擎成功也强制查询所有引擎。 |
MCP 工具概览
服务器公开三个不同的工具,任何 MCP 兼容客户端(LM Studio、LibreChat 或自研应用)都可调用。
1. full-web-search
| Feature | 细节 |
|---|---|
| Search logic | 优先顺序:Bing → Brave → DuckDuckGo |
| Result payload | 包含 url、title、description 和可选 content 的对象数组 |
| Customisation | limit(1‑10)、includeContent(布尔) |
示例请求
{
"name": "full-web-search",
"arguments": {
"query": "TypeScript MCP server",
"limit": 3,
"includeContent": true
}
}
2. get-web-search-summaries
与 full-web-search 使用相同的搜索策略,但仅返回片段/简介——不包含完整页面内容。非常适合快速查询或带宽受限时使用。
示例请求
{
"name": "get-web-search-summaries",
"arguments": {
"query": "best TypeScript web search",
"limit": 5
}
}
3. get-single-web-page-content
当你已知目标 URL 并只需要主要内容时非常有用。
示例请求
{
"name": "get-single-web-page-content",
"arguments": {
"url": "https://example.com/article.html",
"maxContentLength": 5000
}
}
与本地 LLM 客户端一起使用
下面是将服务器集成到 LibreChat 配置中的极简示例。
# librechat.yaml
mcpServers:
web-search:
type: stdio
command: node
args:
- /app/mcp/web-search-mcp/dist/index.js
env:
MAX_CONTENT_LENGTH: "10000"
serverInstructions: true
在聊天信息中:
{{{ full-web-search(query="nodejs web search", limit=5, includeContent=true) }}}
LLM 将收到包含 URL、标题、简介和完整内容的结构化 JSON,可作为生成上下文使用。
性能技巧
| Setting | 作用 |
|---|---|
DEFAULT_TIMEOUT = 4000 |
在慢速网络上更快失败;降低整体往返时间。 |
MAX_BROWSERS = 1 |
减少内存占用;适合低资源环境。 |
BROWSER_HEADLESS = true |
关闭渲染加载,适用于无头模式。 |
RELEVANCE_THRESHOLD = 0.5 |
更严格过滤,获得更高质量结果。 |
记得:调整这些值取决于你的网络、CPU 以及 LLM 请求的大小。
故障排除
| Symptom | 可能原因 | 解决方案 |
|---|---|---|
npm install 失败 |
Node/NPM 过旧 | 升级至 Node 18+ 与 NPM 8+ |
| 浏览器安装卡住 | 代理/网络限制 | 在 VPN 或代理后运行 npx playwright install --with-deps |
| 搜索结果为空 | 引擎被屏蔽 | 调整 BROWSER_FALLBACK_THRESHOLD 或开启 FORCE_MULTI_ENGINE_SEARCH |
| 内存不足 | 浏览器过多 | 减少 MAX_BROWSERS |
出现意外 HTTP/2 错误 |
协议支持问题 | 服务器会自动降级;确保 BROWSER_HEADLESS=true |
扩展服务器
代码基于模块化。添加新工具非常简单:
- 在
src/tools/下创建实现run函数的文件。 - 在
src/index.ts中导出它。 - 如有需要,更新
package.json与mcp.json。
提示:充分利用已存在的 zod 方案验证来强制参数格式。
许可
本项目采用 MIT 许可证。欢迎 fork、修改并应用于你自己的管道。
结束语
Web Search MCP Server 为本地 LLM 开发者填补了重要缺口:即时、无 API 的网页浏览。通过组合多引擎、精巧内容提取以及简洁 MCP 接口,它在同一仓库中提供了深度(完整页面内容)与速度(摘要模式)。无论你是运行小型研究助手还是生产级聊天机器人,这个工具都能让你的 LLM 拥有所需的最新知识,而无需额外成本。
祝你搜索愉快!