复制 MCP JSON 之前,先扫一遍:mcp-vet 的本地预检

0 阅读4分钟

复制一个 MCP server 配置,不只是装插件,而是在把启动命令、环境变量和工具描述交给 agent。mcp-vet 在启用前本地扫一遍,先把 shell wrapper、明文 secret、未固定 npx/uvx 等风险标出来。

我最近装 MCP server 时,越来越有一个不舒服的感觉:

安装体验被简化成了“复制一段 JSON”,但风险没有跟着消失。

那几行配置里,可能同时包含启动命令、参数、环境变量、工具描述。启用之后,agent 会根据这些描述决定什么时候调用工具、怎么传参、怎么把结果继续用于下一步。

所以问题不是“这个 MCP server 一定有问题”,而是:

在真正交给 agent 之前,我们有没有一个很快的本地预检?

我做了一个小工具:mcp-vet

Repo: github.com/metaimagine…

它只做一件事:扫描本地 MCP client 配置,把值得人工复核的风险点先标出来。

mcp-vet implementation flow

它解决的不是“安全审计”,而是启用前那 30 秒

一个 MCP 配置看起来可能只是几行:

{
  "mcpServers": {
    "demo": {
      "command": "npx",
      "args": ["@example/mcp-server"],
      "env": {
        "API_KEY": "..."
      }
    }
  }
}

但这几行里已经有很多值得看一眼的东西:

  • 是否用了 bash -c / cmd /c 这种 shell wrapper;
  • 是否把 token、key、secret 明文写进了 env
  • npx / uvx 是否没有固定版本;
  • 本地命令是否真的存在;
  • 工具描述里是否有会影响 agent 行为的高风险文本。

这些不一定代表恶意,但都应该在启用前被看见。

和现有工具的区别

我没有把 mcp-vet 做成一个“大而全”的安全工具。它更像 MCP 配置启用前的 preflight check。

工具/方式更适合做什么不太覆盖什么
TruffleHog / Gitleaks仓库、文件、历史提交里的 secret 泄露MCP client config 的启动命令、工具描述、agent 上下文
Semgrep / Bandit / Checkov源码、IaC、依赖配置里的安全问题“我要启用这个 MCP server”之前的本地配置复核
MCP security scanner 类项目运行中的 server 或工具行为分析不启动 server 的静态预检、client 配置路径发现
手动 review灵活、准确复制粘贴安装时容易漏,尤其是多 client、多配置路径

mcp-vet 补的是一个更窄的位置:

复制配置之后,真正启用之前。

这个位置适合做成本地、快速、确定性的检查。

实现链路

第一版链路很直接:

  1. 找到本地 MCP client 配置;
  2. 解析 JSON / YAML / TOML;
  3. 提取 server 启动命令、参数、env、metadata 和 tool 描述;
  4. 套一组可解释的静态规则;
  5. 输出 Markdown / JSON / SARIF;
  6. 由人确认、修复或继续启用。

这里刻意没有做动态执行,也不会启动 MCP server。

我更想先把“启用前的静态复核”做稳:规则明确、证据清楚、误报可讨论。

跑起来是什么样

可以这样扫一份本地配置:

mcp-vet scan ~/.config/your-agent/mcp.json --format markdown

输出会像这样:

HIGH  demo.command       shell wrapper detected: bash -c
MED   demo.env.API_KEY   possible secret in env
MED   demo.args          unpinned npx package: @example/mcp-server
LOW   local.command      command not found on PATH

我希望每条 finding 都能回答三个问题:

  • 为什么被标记;
  • 证据在哪;
  • 下一步怎么处理。

比如未固定版本的 npx 不一定是漏洞,但它会影响可重复性,也会让“今天安装”和“下周安装”拿到不同代码。这个点就适合标出来,让人决定是否固定版本。

v0 先覆盖什么

当前 v0 先扫几类高频、低争议的问题:

  • 危险启动方式:bash -ccmd /c、过长 shell 片段;
  • 凭据风险:env 里的 token、key、secret;
  • 供应链稳定性:未固定版本的 npx / uvx
  • 本地环境问题:命令不存在、路径不完整;
  • agent 上下文风险:工具描述里可疑的 prompt-injection 文本。

输出格式先做三种:

  • Markdown:适合本地阅读或贴到 PR;
  • JSON:适合脚本消费;
  • SARIF:适合接入 CI/code scanning。

不做什么

边界也要说清楚:

  • 它不是 sandbox;
  • 不证明 MCP server 一定安全;
  • 不替代代码审计;
  • 不启动 server 做动态行为分析;
  • 不上传你的本地配置。

mcp-vet 更像一道门口的检查:先把明显值得看一眼的东西列出来,再决定是否把工具交给 agent。

我想要的反馈

如果你已经在用 MCP,我最想要三类反馈:

  1. 哪些 MCP client 配置路径还没覆盖;
  2. 哪些规则误报或漏报;
  3. 还有哪些风险适合做成本地、确定性的静态检查。

Repo: github.com/metaimagine…

最有价值的反馈不是“看起来不错”,而是具体到某条规则:这里误报了、那里漏了、这个 client 的配置路径没找到。

配图:metaimagine-ai 生成。