给智能体接联网检索,多数人的做法是塞一个搜索 API Key,然后祈祷返回的内容够用。问题是这条路上有三个坑:一是要为每个 Agent 配一把密钥、管一份额度;二是返回一堆结果后,模型并不知道「为什么停在这里」「有没有源挂了」,它只看到一片摘抄;三是中文查询常被翻译成英文再搜,本地信息源基本搜不到。Agent Search MCP 这个 Node.js 实现的 MCP 服务,就是冲着这三点来的:默认零密钥起跑(免费的检索源不需要任何账号),把结果连同「证据包」一起返回——跑了哪些引擎、为什么停、有没有部分失败、几条结果算几个独立信源,全都写在结构化字段里;中文查询直接走搜狗与百度,不需要翻译层。本教程从零密钥跑通,到把它接进你的 Agent 客户端,再到读懂证据包、设预算、用命令行自检,一步步做完。
Step 1:零密钥跑起来,先确认它到底能返回什么
这个服务最省心的设计是「免费优先」:不配任何凭证时,它依然会用免费可用的检索源返回结果,只是证据更薄一些;付费供应商只有在路由策略与凭证都允许的情况下才会被启用。这意味着你可以先用零配置把链路打通、看清返回结构,再决定要不要为更高的召回付钱。运行方式是纯 Node.js,支持 stdio、Streamable HTTP 与命令行三种形态,所以既能挂进桌面客户端,也能跑在服务器或 CI 里。先做一次体检,确认运行时健康,再谈接入。
# 直接跑(stdio 形态,供 MCP 客户端拉起)
npx -y agent-search-mcp
# 全局安装后自检运行时(不发起真实检索)
npm install -g agent-search-mcp
fasm doctor
需要留意它的定位边界:它不是一个「多引擎聚合器」,而是一个「带证据的检索器」。普通聚合器给你 N 条去重结果就结束了;它额外告诉你这 N 条来自几个彼此独立的信源家族、哪几个上游超时或触发了验证码、以及它是因为「够了」还是因为「撞到预算了」才停下来的。这个区别对 Agent 很关键——模型拿到的是可判断的信息,而不是一片看起来很像答案的文本。
Node 版本是硬门槛:项目要求 Node.js 18.17 及以上,低于这个版本会在启动阶段失败。如果你用 nvm 或 Volta 管理多版本,注意 MCP 客户端拉起服务时用的未必是你终端里那个 node——客户端配置里最好写死绝对路径,或者用 npx 让它自己解析。另外,npx 初次运行会下载包,离线环境请提前缓存。
Step 2:接进你的 Agent 客户端
接入方式和绝大多数 MCP 服务一致:在客户端的 mcpServers 配置里声明一个命令即可。Claude Desktop、Cursor、VS Code、Windsurf 这类接受 mcpServers JSON 的客户端可以直接抄下面这段;Claude Code 与 Codex 也能用同样那条 stdio 命令注册。改完配置一定要重启客户端,然后在对话里让它列一次工具,确认工具真的挂上了再开始用——「配置写了但没生效」是这一步最高频的故障,多半是没重启或配置文件路径选错了。
{
"mcpServers": {
"agent-search": {
"command": "npx",
"args": ["-y", "agent-search-mcp"]
}
}
}
# Claude Code 的等价命令行写法
claude mcp add agent-search -- npx -y agent-search-mcp
# 改完先验证工具可见,再开始干活
# 在客户端里问一句:「你有哪些联网检索工具?」
Step 3:装 Agent Skill,让模型知道该走哪条路
工具挂上之后还有一个问题:模型知道有工具,但不知道什么场景该用哪种搜法。项目额外提供了一个 Agent Skill(兼容 Agent Skills 的客户端可装),装上之后模型会按四条有界路径选择:快速发现、严格验证、中文源检索、以及抽取指定 URL。它的行为很克制——会先检查需要的 MCP 工具是否真的存在,并且在进行任何安装或配置变更之前先问你,不会自作主张改你的环境。这一点对「把工具交给自治 Agent」的场景很关键。
# 安装仓库自带的路由指南(需先接好 MCP Server)
npx skills add lennney/agent-search-mcp --skill agent-search
# 装上之后的典型用法
用 $agent-search 用官方来源核实这条说法。
装 Skill 不等于装服务:官方明确说明,安装这个 Skill 不会启动也不会配置 MCP Server,两件事要分开做。顺序是先配好 Server 并确认工具可见,再装 Skill;反过来装了 Skill 却没服务,模型会在「检查工具是否存在」这一步失败,然后老实告诉你它没法用。
Step 4:读懂证据包,判断这批结果能不能信
这是整套设计里最值得学的部分。每次检索的响应里都带一个「证据包」,它用结构化字段回答了 Agent 在引用一条结果之前必须知道的六件事:跑了哪些适配层(searched_engines)、路由为什么停(stop_reason 与 quality_gate)、有没有撞到工作上限(budget)、证据有没有被截断(evidence_budget)、上游有没有失败(partialFailures)、以及若干条结果到底算几个独立信源(source_count)。最后这一条尤其重要:它按「供应商家族」而不是「适配层名字」计数,同一个上游通过多个适配层进来不会被重复计数,避免了「看起来十条其实是一家」的假多源。
# 响应里该看的字段(示意)
{
"results": [
{ "title": "...", "url": "...", "snippet": "...", "source_count": 3 }
],
"meta": {
"execution": {
"searched_engines": ["duckduckgo", "sogou"],
"stop_reason": "quality_gate_reached",
"quality_gate": { "count": 8, "relevance": 0.72, "confidence": 0.66 }
},
"budget": { "requests": 3, "elapsed_ms": 2100 },
"evidence_budget": { "truncated": false }
},
"partialFailures": [
{ "engine": "brave", "reason": "timeout" }
]
}
把这些字段用起来,你的 Agent 行为会有明显变化:看到 partialFailures 非空,它就知道这批结果有缺口,该补一轮或明说「部分源不可用」,而不是拿半份证据下结论;看到 stop_reason 是预算耗尽而非质量达标,它会知道证据可能还不够;看到 source_count 偏低,它会知道这更像孤证,需要交叉验证。换句话说,它把「检索质量」从看不见的东西变成了可判断的信号。
Step 5:预算与成本控制,别让一次检索烧穿上下文
检索类工具最容易失控的地方不是钱,而是上下文:十条结果每条带一大段正文,一轮下去就把窗口吃掉一小半。项目的做法是用一个统一的「证据预算」约束响应体积,输出保持紧凑但保留出处(provenance);同时用质量闸门来决定何时停——不是「看起来条数够了」就停,而是要满足条数、相关度、置信度与信源覆盖度这一组条件才停。付费供应商只在路由策略明确允许且凭证存在时才跑,所以默认情况下你不用担心意外产生费用。
# 命令行侧:不配任何 key 也能查(走免费源)
npm run build
fasm search "MCP server without an API key" --json
# 响应契约把三件事分开,便于你分别处理
# result evidence → 证据本体
# meta.execution → 执行过程与停止原因
# partialFailures → 上游失败,保持可见
想在接入前先确认它的评分与格式化逻辑长什么样,项目还提供了一个离线契约演示:它用三个合成场景(同源适配层重叠、可见的回退失败、以及撞到质量闸门而停止)跑一遍生产环境的证据打分与格式化代码,全程不发任何网络请求,也不对可用性或搜索质量做任何承诺。这个演示很适合在 CI 里当回归用——你改了提示词或参数,它仍然能验证「契约没变」。
# 离线契约演示(无网络请求,不声明可用性)
npm run demo:evidence
npm run demo:evidence -- --json
失败可见不等于失败已修:partialFailures 只是把上游的超时、限流、验证码、权限与预算问题暴露出来,不会自动重试成功。把它当成一个信号去驱动你自己的策略(换源、退避、缩小查询),而不是当成一个已经被处理掉的问题。
Step 6:把它接进日常工作流,以及该注意的边界
跑通之后,有三类用法最见收益。其一是给编码 Agent 查现成方案:遇到不熟的库或报错,让它先搜官方文档再动手,比直接凭记忆写要稳。其二是做事实核查:明确要求「至少两个独立信源」,用 source_count 兜底。其三是中文信息检索:走搜狗与百度适配层,不必把查询翻译成英文,本地文档、博客与公告的召回会明显好于纯英文引擎。无论哪种,都建议把「证据不足时必须明说」写进你的系统提示词。
# 想确认服务本身健康
fasm doctor
# 想看一次真实返回的结构(再据此写提示词)
fasm search "某个你要查的问题" --json
# 客户端里推荐的说法
先用 agent-search 严格验证这条说法,要求至少 2 个独立信源;
如果 partialFailures 非空或 source_count 少于 2,就明确回答「证据不足」。
检索结果仍然是不可信输入:搜回来的网页内容对模型而言是外部输入,里面可能夹着提示词注入或错误信息。不要让 Agent 因为「搜到了」就照做,尤其是涉及执行代码、改配置、发请求这类动作时,把检索结果与执行动作分开,重要步骤仍然要人确认。免费源在稳定性与覆盖度上也弱于付费供应商,关键业务请评估后补上凭证并设好额度。
常见问题速查
| 现象 | 原因与处理 |
|---|---|
| 启动即失败 | Node 低于 18.17;升级或在客户端配置里写死可用 node 的绝对路径 |
| 客户端里看不到工具 | 改完配置没重启客户端;或配置文件路径不是当前生效的那个 |
| 装了 Skill 却还是不会搜 | Skill 不会启动服务;先配好 MCP Server 并确认工具可见,再装 Skill |
| 结果看着多但像一家之言 | 看 source_count 而不是条数;它按供应商家族计数,同一上游不重复计数 |
| 不知道该不该信这批结果 | 查 partialFailures 与 stop_reason;上游失败或撞预算而停,都要补搜 |
| 上下文被检索结果吃满 | 用证据预算约束体积;改为「先锁定 URL、再对选定 URL 抽取精读」 |
| 中文查询召回差 | 确认走了中文适配层(搜狗/百度),不要把问题翻译成英文再搜 |
| 担心产生意外费用 | 付费供应商只在策略与凭证均满足时才启用;不配凭证就不会跑 |