关于 mcpvet
mcpvet 是用于安装前检查 MCP 服务、Agent 技能、客户端配置和 npm 包的安全扫描器。它以静态检查和证据生成判定,也提供可选的实时探测来比较服务器响应。
主要功能
- 01静态扫描,不执行目标
- 02检查工具、配置、脚本和清单
- 03标记能力风险与仿冒名称
- 04生成附带证据的确定性判定
- 05可选实时一致性与指纹探测
适用场景
- 01安装前审查 MCP 服务
- 02审计技能目录和客户端配置
- 03使用前检查 npm 包元数据
- 04通过多次探测比较 stdio 服务
MCP 相关
`mcpvet mcp` 命令提供 stdio MCP 服务,可检查本地路径、npm 包元数据并探测 stdio 服务命令。探测工具会执行指定命令。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
2收录的工具列表 · 更新于 3 天前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| path | string | 是 | 要检查的本地目录:MCP 服务目录、包含 SKILL.md 的技能目录,或包含客户端 MCP 配置的目录树 |
详细介绍
mcpvet
在安装 MCP 服务和 Agent 技能前,先进行审查。
2026 年初,ClawHavoc 浪潮席卷了一个公开技能市场:仅 12 个账户就发布了 1,184 个恶意技能。这些技能把凭据窃取程序和反向 shell 伪装成实用的 Agent 技能,并继承 Agent 本身拥有的所有权限。只有少数组织会审查自己安装的 MCP 服务,几乎没有组织会审查技能包。点击安装就是做出信任决定,但通常完全没有任何证据。
mcpvet 是安装前检查工具。将本地 MCP 服务目录、SKILL.md 技能目录、客户端配置树或 npm 包名交给它,它就会返回确定性的判定,并为每项发现提供证据:VETTED、REVIEW 或 DO-NOT-INSTALL。扫描仅为静态扫描。扫描的代码只会作为文本读取,绝不会执行、导入或安装。
从 0.2.0 开始,另有一个明确标注的实时模式(mcpvet probe)。它会启动 stdio 服务命令两次,并比较其响应:探测一致性、精确哈希指纹匹配,以及根据记录信号得出的服务级风险评分。实时模式会执行目标,因此它才会作为单独的命令提供,而不会并入静态扫描。
安装
npx -y @reneturcios/mcpvet --version
npm install -g @reneturcios/mcpvet
docker run -i --rm ghcr.io/cloudcorprecords/mcpvet mcp
快速开始
mcpvet vet ~/src/some-mcp-server
mcpvet vet ~/skills/some-skill --json
mcpvet vet-package @modelcontextprotocol/[email protected]
mcpvet probe -- node ~/src/some-mcp-server/dist/index.js
mcpvet mcp
CLI 退出代码:判定为 VETTED 时返回 0;判定为 REVIEW 或 DO-NOT-INSTALL 时返回 1;用法或设置错误时返回 2;在报告送达前读取端关闭了输出管道时返回 141。
检查内容
| 检查项 | 检查内容 |
|---|---|
| 工具清单 | 将声明的工具(server.json、package.json、工具清单)与源码中实际注册的工具进行比对,同时检查资源和提示词 |
| 能力组合 | 文件系统读取加网络外连、环境变量访问加网络外连、凭据存储访问加网络外连,以及可从工具接口触达的 Shell 执行 |
| 配置审计 | 客户端配置(claude_desktop_config.json、.mcp.json、Cursor 和 VS Code mcp.json):自动启动条目、对未固定版本的软件包使用 npx -y、通过 curl 管道启动 Shell 的启动器、Shell 包装脚本、包含凭据类键的宽泛环境变量块、传递整个环境 |
| 安装脚本 | package.json 中的 preinstall、install、postinstall 和 prepare 脚本;具有投放器特征(远程下载内容通过管道传给 Shell)的脚本会被评为严重 |
| 清单真实性 | 如果 package.json 或 server.json 存在,但无法解析、无法读取、过大而被跳过,或不是常规文件,则会报告为存在但未经审计,并标记为 MANIFEST-UNPARSEABLE 或 MANIFEST-UNREADABLE,绝不会报告为不存在。解析前会剥除字节顺序标记前缀,因此带 BOM 前缀的清单也会正常接受审计 |
| 随附脚本 | 反向 Shell 特征(包括由套接字连接、启动的 Shell 和连接两者的管道组成的反向 Shell)、同一文件既读取凭据存储又发出网络请求、持久化操作(会话钩子、计划任务、自动启动条目)、下载并执行的投放器 |
| 描述中的语言 | 工具描述、软件包描述和 SKILL.md 文本中包含指令或数据外传相关语言:覆盖先前指令、向用户隐瞒操作、转发凭据材料、根据文字运行 Shell 命令 |
| 文档中的下载并执行 | 软件包中任何位置以文本声明的下载并执行步骤(SKILL.md 前置要求、README、其他文档、随附脚本):将远程下载内容通过管道传给 Shell 或解释器、通过命令替换传入 Shell 或解释器,或在同一行下载并运行。与自动启动配置和安装脚本中的同类特征一样,会被评为严重。只有下载而没有执行步骤不会触发此项发现 |
| 原生二进制文件 | 软件包中随附的已编译原生构件(.node、.dll、.so、.dylib 文件,或 prebuilds 目录)。静态文本扫描无法审计原生代码,因此此项会被评为中等,并标记为 NATIVE-BINARY,且判定结果最低为 REVIEW:存在原生二进制文件并不能证明存在恶意行为(许多合法软件包都会随附预构建的扩展),且仅凭此项绝不会升级为 DO-NOT-INSTALL;但在信任该服务前,应审查该二进制文件,或从源码构建软件包。MALFEX imgdecode 活动正是以这种方式隐藏有效载荷:在 prebuilds/ 下放置一个原生扩展,在 require 时加载,且完全没有安装脚本 |
| 不匹配项 | 代码中缺少已声明的工具、代码中存在未声明的工具、server.json 与 package.json 中的名称或版本不一致 |
| 版本固定 | 缺少版本字段、latest 或 * 等滚动标签、没有版本号的注册表条目、未固定版本的容器引用 |
| 仿冒名称 | 目标名称与软件包名称和随附的知名 MCP 服务名称列表相比,编辑距离为 1(长名称为 2) |
| 探测一致性(仅实时模式) | 启动两次服务并提出相同问题(initialize、tools/list)。两次相同探测在身份、工具集、描述或架构上的任何差异都会作为信号记录,并以差异内容作为证据 |
| 指纹(仅实时模式) | 对呈现的工具集和工具描述进行哈希处理(基于规范 JSON 计算 sha256),并与随附的指纹文件进行比对。仅进行精确匹配,绝不进行模糊匹配,且每个条目都包含其来源信息 |
| 风险评分 | 每份报告都会根据已记录的信号(静态发现,或探测模式下的实时信号)生成 0 到 100 的评分。评分读取时根据信号列表计算,不会作为计数器保存;评分会影响判定结果,但不会取代判定规则 |
判定规则
- DO-NOT-INSTALL:至少有一项严重发现。反向 Shell、凭据窃取程序、安装投放器、curl 管道接 Shell 的自动启动项,以及技能文档中声明的下载并执行步骤,都归入此类。
- REVIEW:至少有一项高危或中危发现,且没有严重发现。危险能力组合、未声明的工具、拼写仿冒、环境变量收集配置,以及未固定版本的自动启动项,都归入此类。部分扫描也至少归入此类:存在清单但无法解析或读取时,扫描未能覆盖整个目标,因此在这种状态下无法判定为 VETTED。
- VETTED:没有严重、高危或中危发现。信息级和低危发现(例如自动启动项清单本身)仍会作为证据报告。
判定结果是扫描结果,绝不代表安全保证。VETTED 表示在已扫描文件中,这些检查未发现严重程度达到中危或更高的情况;这并不证明服务安全。
范围底线(v0.1.2):DO-NOT-INSTALL 是针对可安装 MCP 捆绑包的判定。如果目标不是 MCP 目标(类型为 unknown,即主要对象不是服务、配置或技能;或者是 mixed 单体仓库根目录,且其所有严重发现都来自已识别 MCP 捆绑包之外),判定至少为 REVIEW,并明确注明“不是 MCP 目标”,提示将审查范围限定为服务或技能目录。发现仍会作为证据报告;已识别捆绑包内的严重发现仍会判定为 DO-NOT-INSTALL。
实时模式(probe)有其独立且刻意设定上限的判定规则:任何评分信号(奇偶性偏差或指纹匹配)都会使判定为 REVIEW;双重探测均无异常则判定为 VETTED;没有可用证据则判定为 REVIEW,表示结论不确定。实时证据永远不会导致 DO-NOT-INSTALL:指纹匹配足以引起人工检查,但不是直接判定失败的理由。明确规定了两种阴性对照:因身份验证原因而被拒绝的探测记为该次探测通过(要求凭据的服务至少做对了基本事项);超时则不记录任何信号。
MCP
mcpvet mcp 会启动一个 stdio MCP 服务,提供三个工具:
| 工具 | 功能 |
|---|---|
| vet_path | 在安装前审查本地 MCP 服务目录、技能目录或客户端配置树 |
| vet_package | 仅使用注册表元数据按名称审查 npm 包:不会下载 tarball,也不会运行任何代码 |
| probe_server | 对 stdio 服务命令进行实时探测(启动两次):探测奇偶性、精确哈希指纹和派生风险评分。此工具会执行给定的命令 |
范围与限制
- 按设计,仅进行静态分析。mcpvet 不会执行、导入或安装目标;vet_package 也不会下载 tarball。仅在运行时出现的行为不在范围内;请对提取后的目录进行能力和清单检查。
- 实时模式是唯一例外,并且每次调用都需主动启用:
probe(或 probe_server MCP 工具)会在运行 mcpvet 的机器上将给定命令启动两次。仅对你已足够信任、可以在本地执行的命令运行此模式。 - 0.2.0 随附的指纹文件取自 mcpvet 自身的测试夹具(标记为测试种子,由 scripts/gen-seeds.ts 通过探测夹具服务生成),而非来自实际观察到的服务。只有在有记录的证据支持时才会添加条目,并注明各自的来源。
- 工具清单检查基于模式:扫描器无法识别的形式(动态注册、生成代码)注册的工具可能会被漏掉,因此,声明了清单却没有匹配的注册本身也会被列为发现项。
- 遍历最多处理 2,000 个文件,每个文件最多 512 KiB。任何被跳过的内容都会计数,并在报告的 caps 区块中说明,绝不会静默丢弃。如果被跳过的文件是 package.json 或 server.json,判定结果的最低等级也会设为 REVIEW,因为清单本身未经审查。
- 待审查目标必须是目录。普通文件、FIFO、设备或不存在的路径都属于用法错误,退出码为 2,不会给出判定结果。
- 根据设计,此扫描器无法解析编译后的原生代码。包含原生构件(.node、.dll、.so、.dylib 或 prebuilds 目录)的目录树会触发一条中等级别的 NATIVE-BINARY 发现项,判定结果至少为 REVIEW;该发现项仅报告其存在,不对二进制文件的行为作任何断言。
- 仿冒拼写列表是知名 MCP 服务名称的内置快照,并非实时注册表。
- 在静态文本扫描中,模式字面量与载荷无法区分:安全扫描器的源代码(或测试夹具语料库)本身就包含它要检测的那些形式,因此审查检测工具会触发其自身的模式字符串(这一情况曾出现在 Security Wave 工厂仓库中,其中所有此类关键发现项都经过人工核实,确认是模式字面量或植入的夹具)。请将针对扫描器源代码的判定视为 REVIEW 级别的证据,而非遭到入侵的断言。
属于 Security Wave:hookcheck(持久化钩子)、actionpin(Actions 固定版本)、injectcheck(Agent 可读取内容中的提示词注入)、tracewatch(可观测性和根因分析)、mcpvet(安装前审查)。
MIT。
如果 mcpvet 为你节省了时间,请为此仓库点个星:这能帮助其他开发者找到它。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。