复制一个 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 配置,把值得人工复核的风险点先标出来。
它解决的不是“安全审计”,而是启用前那 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 补的是一个更窄的位置:
复制配置之后,真正启用之前。
这个位置适合做成本地、快速、确定性的检查。
实现链路
第一版链路很直接:
- 找到本地 MCP client 配置;
- 解析 JSON / YAML / TOML;
- 提取 server 启动命令、参数、env、metadata 和 tool 描述;
- 套一组可解释的静态规则;
- 输出 Markdown / JSON / SARIF;
- 由人确认、修复或继续启用。
这里刻意没有做动态执行,也不会启动 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 -c、cmd /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,我最想要三类反馈:
- 哪些 MCP client 配置路径还没覆盖;
- 哪些规则误报或漏报;
- 还有哪些风险适合做成本地、确定性的静态检查。
Repo: github.com/metaimagine…
最有价值的反馈不是“看起来不错”,而是具体到某条规则:这里误报了、那里漏了、这个 client 的配置路径没找到。
配图:metaimagine-ai 生成。