mcpField
M
mcpvet

mcpvet

本地服务
github.com/CloudCorpRecords安全02 天前更新

关于 mcpvet

mcpvet 是用于安装前检查 MCP 服务、Agent 技能、客户端配置和 npm 包的安全扫描器。它以静态检查和证据生成判定,也提供可选的实时探测来比较服务器响应。

主要功能

  1. 01静态扫描,不执行目标
  2. 02检查工具、配置、脚本和清单
  3. 03标记能力风险与仿冒名称
  4. 04生成附带证据的确定性判定
  5. 05可选实时一致性与指纹探测

适用场景

  1. 01安装前审查 MCP 服务
  2. 02审计技能目录和客户端配置
  3. 03使用前检查 npm 包元数据
  4. 04通过多次探测比较 stdio 服务

MCP 相关

`mcpvet mcp` 命令提供 stdio MCP 服务,可检查本地路径、npm 包元数据并探测 stdio 服务命令。探测工具会执行指定命令。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"cloudcorprecords-mcpvet": {
"command": "npx",
"args": [
"-y",
"@reneturcios/mcpvet"
]
}
}
}
启动命令npx -y @reneturcios/mcpvet

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npm@reneturcios/mcpvet0.2.1
ocighcr.io/cloudcorprecords/mcpvet:0.2.1

工具

2

收录的工具列表 · 更新于 3 天前

参数类型必填说明
pathstring是要检查的本地目录:MCP 服务目录、包含 SKILL.md 的技能目录,或包含客户端 MCP 配置的目录树

详细介绍

mcpvet

npm version npm downloads MCP Registry

在安装 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 为你节省了时间,请为此仓库点个星:这能帮助其他开发者找到它。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。