关于 Closeread Verify
Closeread Verify 是面向 Agent 和开发团队的确定性依赖审计 MCP 服务。它依据锁文件中的实际安装版本核对 OSV.dev 通告,区分直接与传递依赖,并给出优先级判定和具体修复建议。
主要功能
- 01审计锁文件中的安装版本
- 02区分直接与传递依赖
- 03突出高危直接生产依赖问题
- 04对照 OSV.dev 核验通告
- 05支持五类软件包生态
适用场景
- 01发布前审计依赖
- 02检查公开仓库中的易受攻击版本
- 03判断问题属于直接还是传递依赖
MCP 相关
MCP 服务向客户端提供 `audit_project`、`audit_dependencies` 和 `audit_repo`。它返回经过核验的依赖判定,供 Agent 直接采取行动,而非要求其解读原始扫描结果。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
closeread-verify
任何 AI Agent 都能调用的、经过验证的依赖审计结论。
免费扫描器会给你一堆原始 CVE。closeread-verify 给你的是判断:根据你实际安装的版本核验过的结论、最重要的一项发现,以及精确的修复方案。它以 MCP 服务的形式运行,因此任何 Agent(Claude Code、Cursor,或你自己的 Agent)都可以在发布代码前调用它,得到经过核验的答案,而不是一堆杂乱信息。
为什么选它,而不是 npm audit
原始扫描器和 Agent 本身都能列出一堆 CVE,但它们无法凭空得出 审计结论。closeread-verify 围绕一项关键原则构建,这正是实际审计与扫描之间的区别:
- 它报告已安装的版本,而不是声明的最低版本。 清单中的
^4.17.0并不代表你实际发布的版本。工具会从锁文件中解析出真正锁定的版本并检查 该版本,因此不会对你已经修复的脱字符版本范围误报,也不会漏掉仅扫描清单时可能放过的易受攻击锁定版本。 - 它会区分直接依赖和传递依赖。 你声明并负责维护的依赖(需要由你升级),会与向下追溯五层继承的依赖分开。大多数扫描器会把它们混成一份无法区分的列表,而这个工具会明确指出各自的类型。
- 它会突出最重要的一项发现。 你得到的不是 200 条记录,而是一个
lead:严重程度最高的 直接生产环境 问题,并附上精确的修复方案。如果发现的问题都只是传递依赖或仅存在于开发环境,lead会如实返回null,而不是捏造一个头条。 - 结果是确定且可重新核验的。 流程中不使用 LLM。同一份锁文件输入,会得到同一份结论。公告会与 OSV.dev 上的信息进行核实。结论会附带自身的依据,方便审查者重新运行核验。
经过验证的产物才是产品,而不是原始扫描结果。
安装
pip install closeread-verify
需要 Python 3.11+。无需 API 密钥、账号或源代码访问权限。输入锁文件,输出审计结论。
在 Agent 工作流中试用
examples/agent_loop.py 是一个可运行的 Agent 示例,它将 closeread-verify 用作发布前的检查关卡:遇到真实的 Flask CVE 时阻止发布,应用指定的修复,重新检查,然后发布。通过 stdio 运行真实 MCP,使用真实的 OSV 公告,无需 API 密钥。
python examples/agent_loop.py
将其用作 MCP 服务
closeread-verify 是用于启动服务的 stdio 命令:
closeread-verify
客户端配置
将其添加到 MCP 客户端。适用于 Claude Code / Cursor 风格的配置(mcp.json /
claude_desktop_config.json):
{
"mcpServers": {
"closeread-verify": {
"command": "closeread-verify"
}
}
}
如果你将它安装在特定环境中,请改为指定该环境中的解释器:
{
"mcpServers": {
"closeread-verify": {
"command": "python",
"args": ["-m", "closeread.mcp_server"]
}
}
}
三个工具
| 工具 | 输入 | 使用场景 |
|---|---|---|
audit_project | files:{filename: content} 映射 | 你有一个实际的代码检出。请同时传入清单 和 锁文件(例如 package.json + package-lock.json),以便还原直接依赖与传递依赖的区分。允许使用 server/package.json 这样的子目录前缀。 |
audit_dependencies | lockfile_content:str,filename:str | 你只有单个清单或锁文件,并希望一次性获得审计结论。 |
audit_repo | github_url:str | 你有一个公开仓库 URL。该工具会浅克隆仓库并运行相同的审计。如果克隆失败,会返回错误,绝不会捏造结果。 |
文件名至关重要:它决定内容将交由哪个生态系统解析器处理。支持的锁文件包括 package-lock.json、yarn.lock、
pnpm-lock.yaml、requirements.txt、poetry.lock、Pipfile.lock、
Gemfile.lock、composer.lock 和 Cargo.lock。
示例
对固定了 flask==0.12.0 的 requirements.txt 调用 audit_dependencies:
{
"source": "lockfile:requirements.txt",
"lead": {
"summary": "[email protected] affected by GHSA-562c-5r94-xh97",
"severity": "high",
"is_direct": true,
"dependency_kind": "prod",
"location": "requirements.txt:1",
"fix": "Update flask to a patched version (see references).",
"confidence": 0.9
},
"findings": {
"issues": [],
"direct": [
{
"kind": "dependency",
"package": "flask",
"severity": "high",
"is_direct": true,
"versions": ["0.12.0"],
"advisories": ["GHSA-562c-5r94-xh97", "GHSA-5wv5-4vpf-pj6m", "GHSA-m2qf-hxjv-5gpq"],
"locations": ["requirements.txt:1"],
"recommendation": "Update flask to a patched version (see references)."
}
],
"transitive": []
},
"counts": { "product_critical": 3, "issues": 0, "direct": 1, "transitive": 0 },
"verification": {
"basis": "each version is the INSTALLED version resolved from the lockfile, not the declared floor; advisories confirmed via OSV; result is deterministic and re-checkable",
"scanner": "closeread SCA (deterministic, no LLM)",
"advisory_source": "OSV.dev",
"as_of": "2026-06-08T12:00:00+00:00"
}
}
Agent 无需解读扫描结果。它得到的是可执行的判定:升级 flask,这是对应的行,这就是原因。
面向 Agent 时代的已验证审计原语
Agent 正开始自主编写、审查和发布代码。在 Agent 发起 PR 或批准部署之前,它需要得到一个简单且可核验的问题的答案:我依赖的组件中,是否有任何已知存在漏洞,且漏洞版本正是我实际固定的版本?这是否是我需要修复的问题? closeread-verify 就是这个原语。一次 MCP 调用,一个确定性的判定,无需让大模型介入,也就不会凭空捏造不存在的 CVE,或漏掉确实存在的 CVE。
坦诚说明范围
- 生态系统: npm/yarn/pnpm、pip/poetry/pipenv、RubyGems、Packagist (Composer)、crates.io(Cargo)。
- 确定性: 不使用大模型;除查询 OSV.dev 安全公告外,不进行网络访问。
- 仅限锁文件: 它会读取清单和锁文件,不需要、不会请求,也不会传输你的源代码。
- 它不是什么: 这是免费且确定性的依赖审计层级。它不是全面的代码审查,不是 SAST 引擎,也不是许可证或架构审计。它只做一件事:对你的依赖给出经过验证的判定。
许可证
MIT。由 Free Guy 构建。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。