ModSearch 是什么
包名是 @liustack/modsearch,当前版本 5.10.2,作者 Leon Liu,MIT 许可。仓库把它定位成「DeepSeek Harness(dsh)上最强的免费网页搜索插件」,而它的卖点其实很窄、也很可验证:DeepSeek、GLM 这类模型没有联网能力,或能力很弱,这个插件补上网页搜索、X 搜索与单页抓取三件事。在 dsh 里,它会挂出一张插件配置卡片,位置在「设置 → 插件 → 插件配置」。
需要点明的是它没有声明什么:README 没有给出任何评测或基准,也没有说自己在比较中胜出。所以「最强」应当读作作者定位,而不是已核实的结论。
你装的是什么:读清单,而不是读口号
有两个字段决定了你实际装到的东西,值得逐条说明。
顶层的 dsh 字段声明的是一个 Cordis bundle:bundle.patch 指向 ./cordis.patch.yml,由 harness 在挂载时应用。它还声明了浏览器侧的一半——platform: "web"、client.inject: []、immediately: true,意思是这是一个 web 平台客户端包,立即激活,且不需要注入任何服务。README 证实了它可见的后果之一:dsh 设置页里确实有一张 ModSearch 卡片。但 README 没有说明这个 patch 改写了什么,patch 文件本身也不在本条目的源材料中,因此 patch 究竟动了哪一行,这里不做断言。
files 数组才是这个 tarball 的诚实清单:dist、docs、skills/modsearch/SKILL.md、skills/modsearch/scripts、skills/modsearch/references、CHANGELOG.md、SECURITY.md、dsh、cordis.patch.yml。也就是说,你一次装进来的是三样东西——一个 CLI、一个 agent Skill,以及 dsh bundle。包的运行时依赖只有两个:commander(命令行参数解析)与 undici(HTTP 客户端),没有更重的东西。
搜索背后到底是什么
每一次搜索与抓取都由第三方引擎执行。默认是 Firecrawl 的无密钥层(Keyless),装完即用;其他可选引擎为 Antigravity CLI、Tavily、Exa、Grok Build(X/Twitter 搜索)以及 local(只做页面抓取)。配置了多个引擎就构成一条链,失败时自动故障转移。
密钥是可选的,放在 ~/.modsearch/config.json(权限 0600,展示时会遮蔽),或通过 TAVILY_API_KEY、EXA_API_KEY、FIRECRAWL_API_KEY 环境变量提供。同一引擎可以给多个逗号分隔的密钥;遇到认证失败、限流或额度耗尽时,先在同一引擎内轮换密钥,再往下走链条。兼容 Tavily、Exa 或 Firecrawl 协议的自建端点可以用 baseURL 指过去——README 说官方端点始终编在代码里,不会被写成默认配置。
这是本插件的信任核心,请精确理解。 插件自身的代码与依赖(commander、undici)不含任何搜索索引;结果来自 Firecrawl、Tavily、Exa、Antigravity 或 Grok。ModSearch 的角色是驱动这些上游。README 的免责声明只说了这一句:上游引擎「each carry their own terms and quotas, and complying with them is the user’s responsibility」(各有自己的条款与配额,遵守它们是用户的责任)——关于上游关系,源材料就说到这里。
源材料没有说、而读者容易默认的部分:它从未说明请求是否经过任何 liustack 运营的中间服务,还是从你的机器直连引擎端点;从未说明 ModSearch 是否记录查询;没有公布任何留存或遥测政策;也没有说明 Firecrawl 无密钥层背后到底是哪个搜索索引。「没说会记录」不等于「不会记录」。
它具体做什么
- 网页搜索:走配置好的引擎链,返回模型可直接消费的结构化 JSON,而不是抓取到的页面标记。
- 页面抓取是独立一步:抓不抓整页、什么时候抓,由模型决定,token 花在哪儿可控。README 点名了一个
read_page工具,可以连续读多个页面。 - 带置信度提示:一次演示返回六条带来源的资讯,并附一句「哪些细节来自聚合、值得再看一眼」;README 把这句提示归因于
uncertainty字段。 - X(Twitter)搜索,这一条要读仔细:所谓「触及网页索引够不到的语料」,前提是 With Grok Build installed(装上 Grok Build),并且它借助 SuperGrok 或 X Premium 订阅运行。X 搜索没有无密钥路径。
- 故障转移与单引擎密钥轮换,也可以直接禁用某个引擎。
- dsh 设置里的配置卡片:选首选引擎、填 API key 或自建端点、勾选哪些引擎参与故障转移。README 里给其他 harness(Claude Code、Codex、Pi、OpenCode)的安装说明走的是 Skill 安装路径,卡片是 dsh 专属的那条路。
运行要求,以及「免费」到底免费在哪
- Node.js 22.13 或更新——写在
engines里,这是硬下限而不是建议。 - 可用的对外网络。这里没有任何东西是离线的,而
local引擎覆盖的是页面抓取,不是搜索。 - 默认配置不需要密钥,也不需要账号,这条适用于 Firecrawl Keyless 上的网页搜索与页面抓取。
- 只有想要更多时才需要账号。 Antigravity CLI 需要一次浏览器登录;Grok Build 需要 SuperGrok 或 X Premium。免费的 Tavily、Exa、Firecrawl 密钥都是可选项。
- harness 最低版本在 README 里没有说明。 README 与清单都没有声明 harness 版本、peer 范围或
dsh.compatibility块,因此本条目不记录dshTarget,验证等级止于L2。README 同样没有给出支持的操作系统清单。 - 代理与 VPN 是能活的。 README 说 Clash、Clash Verge Rev、mihomo、Surge 的 fake-IP 模式开箱可用,因为
198.18.0.0/15内的 DNS 答案被当作 fake-IP 占位符、不需要开关;而allowPrivateNetwork关闭时,http://198.18.0.5/这类字面地址仍会被拦下。
这里的免费是别人家的免费额度,不是一项无限服务。Firecrawl Keyless 每月给 1,000 credits,不要账号、不要 API key、不要信用卡;再配一个免费 Firecrawl 密钥,可以在无密钥额度之上再加个人的 1,000/月。Antigravity CLI 免费,代价是一次浏览器登录。Tavily 每月 1,000 credits,不需要卡;Exa 是每月重复发放的 $10 额度,README 形容为大约 1,400 次搜索。Grok Build 不免费,它借助付费的 SuperGrok 或 X Premium。
所以:「无需注册」和「无需 API 密钥」对默认的网页搜索与抓取路径是真的,对 X 搜索是假的。 X 搜索需要 Grok Build,而 Grok Build 需要付费账户。
而且这个安排不是保证的。上面每一个额度都是上游厂商公布的政策,README 自己就把无密钥层描述成一次发布安排。如果 Firecrawl 调整、限流或下线无密钥层,默认引擎就失去额度,链条会退到你还配置过的其他引擎——而全新安装时,那个「其他」是空的。额度耗尽也未必报错:故障转移本就是设计好的反应,所以可能发生静默切换到另一个引擎。源材料没有给出任何可用性承诺,也没有说明单次搜索或单次抓取消耗多少 credits。
隐私:你的查询去了哪里
查询会离开本机。默认安装下,你搜索的文字被送往 Firecrawl 的无密钥服务;你抓取的页面 URL 被送往实际执行抓取的引擎。一旦你加上 Tavily、Exa、Antigravity 或 Grok Build,这些服务就会看到查询。它们如何处理这些数据遵循各自的条款——README 在免责声明里正是把这份责任交给了用户。
有两点是站在插件这边的:密钥保存在 ~/.modsearch/config.json,权限 0600,展示时遮蔽;包内附带 SECURITY.md,安全文档提到了 SSRF 防护、DNS 重绑定防护与不可信输入处理。
没有说、也不该被推断的部分:README 从未声称这个插件是私密的,没有说明是否存在 liustack 运营的中间层看到你的流量,没有说明查询或结果是否被记录到任何地方,也没有说明这些 SSRF 与防重绑定防护具体覆盖什么、作用在哪一层。包内不存在 permissions 字段,本站把这条目录记为 security: unverified。如果你要搜索的内容不适合粘给一个第三方网络服务,就不要指望这个插件会降低这种暴露。
已知限制,以及什么时候用它、什么时候不要用
README 相当愿意直说失败模式,这里直接引用而不是改写:
- 「When a channel fails or exhausts its quota, the next one takes over.」(通道失败或额度耗尽时,下一个接管。)所以覆盖能力取决于你配置了哪些引擎、以及它们还剩多少额度。
- 单引擎密钥轮换只在「authentication, rate-limit, and quota failures」(认证失败、触发限流、额度耗尽)时触发,其他情况不会。
- 上游免责声明:引擎「each carry their own terms and quotas, and complying with them is the user’s responsibility」;作者不提供任何明示或默示担保,「商业或其他用途」皆然。
- 覆盖缺口:只搜索开放网页与 X,而 X 还需要 Grok Build。没有说明其他封闭平台有对应引擎,也没有说明任何引擎的索引深度、时效性与语言覆盖。
- 产品缺口:没有 OpenSearch 兼容引擎,也没有浏览器或搜索栏集成;
local是页面抓取引擎而不是索引,没有网络引擎就无法搜索任何东西。 - 命名缺口:README 点了
read_page这一个工具,但从未列出 dsh bundle 实际注册的工具集,所以模型会调用哪些工具名,源材料没有说明;files里列的SKILL.md也没有包含在本条目的源材料中。 - 独立性:源材料没有公布任何第三方安全复核或恶意软件扫描;仓库明确「does not accept pull requests」,只由作者一人维护。单维护者是可持续性信号,不是缺陷,但应纳入考虑。
- 源材料没有给出星数、用户数或安装量。本条目里的
stars: 471来自本站元数据,不是包本身的声明。
当你用的 dsh 模型上不了网、又想一步把搜索跑起来且不愿注册任何东西时,用它。Firecrawl 无密钥默认就是这条目录存在的理由:搜索与页面获取立刻可用,uncertainty 字段与逐条引用让结果可核查,而不是一段黑箱摘要。如果你已经在为 Grok 付费,补上 X 覆盖是这里唯一网页索引复制不了的能力。
当负载很大、或必须可预测时,不要把它当作付费搜索 API 的替代品:默认引擎是共享的免费层,故障转移会被设计成静默进行,源码没有承诺任何吞吐量。也不要以为它是私密的——查询按构造就会发给第三方,而没有任何日志或留存声明可以否认这一点。更不要以为装上就有 X 搜索:没有 Grok Build 与付费订阅,这个能力根本不存在。
FAQ
X(Twitter)搜索真的不需要凭据就能用吗?
不能。README 把 X 搜索明确绑定到 Grok Build:「With Grok Build installed, ModSearch queries the corpus that web indexes cannot reach」,引擎表又写明 Grok Build 是借助「SuperGrok or X Premium」运行的,两者都要付费。无需密钥就能用的是网页搜索与单页抓取,X 不在其中。
「无需 API key」这条成立吗?
对默认路径成立,也仅限于此。搜索与页面获取走 Firecrawl 的无密钥层,不需要账号、API key 或信用卡。但每多加一个引擎、每为更高额度配一把密钥,都会把密钥重新引入——它们存在 ~/.modsearch/config.json 或环境变量里。
免费额度是保证的吗?
不是,源材料也没有这样暗示。1,000 credits/月在 README 里指向的是 Firecrawl 无密钥层的发布安排,而它自己的免责声明就写明各上游引擎 «各有自己的条款与配额»。包里没有任何东西能让作者承诺别家的额度会一直存在。
我的搜索词会留在本机吗?
不会。查询会发给执行它的引擎,默认安装下就是 Firecrawl 的无密钥服务;页面 URL 则发给执行抓取的引擎。README 没有说明是否存在中间层、是否记录日志、留存多久。可以确定的是密钥以 0600 保存并在输出中遮蔽。
实际装进来的到底是哪些东西?
npm 包 @liustack/modsearch@5.10.2:一个名为 modsearch 的 CLI、skills/modsearch 下的 agent Skill,以及由顶层 dsh 字段声明的 dsh bundle(bundle.patch: ./cordis.patch.yml,外加一个 web 客户端半边)。运行时依赖只有 commander 与 undici。Cordis patch 文件本身不在本条目可用的源材料里,因此它改写了什么,这里不做断言。
