关于 mcpm
mcpm 是一款本地命令行工具,用于查找、安装、管理和审计 MCP 服务,并提供信任评估与运行时检查。它面向跨 AI 客户端管理 MCP 配置的用户,将包管理流程与本地安全控制结合起来。
主要功能
- 01搜索并安装注册表中的服务
- 02评估信任度并审计安装项
- 03通过本地中继检查工具调用
- 04固定工具定义并检测变更
- 05管理服务堆栈和锁定文件
- 06检查客户端配置健康状况
适用场景
- 01安装前评估 MCP 服务风险
- 02审计多个客户端中的已安装服务
- 03复现项目锁定的服务配置
- 04查找配置问题和明文密钥
MCP 相关
mcpm 管理 MCP 服务安装和客户端配置。它的本地 stdio 中继位于 AI 客户端与服务之间,用于检查工具调用并检测工具定义变更。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
mcpm — MCP 安全防护工具和包管理器
在运行时、在你的机器上,拦截 Model Context Protocol(MCP)服务中的提示词注入、工具投毒、rug-pull 和凭据窃取。 你的 AI Agent 会信任它交互的每个 MCP 服务;mcpm 会为每次安装评分,使用 Sigstore 验证其供应链,固定每个工具定义,并通过本地中继检查每次工具调用——在 macOS 上还可选择启用操作系统沙箱。执行防护的路径上没有云服务、账号或大模型。
一切都在你的机器上运行。 无需账号,没有 mcpm 后端,也没有遥测——防护程序是本地 stdio 中继,信任评分在本地计算,不使用模型,也没有远程判定(40 分的静态扫描部分由确定性的正则表达式和结构检查组成,你可以自行查看;其余部分是本地健康检查、注册表元数据,以及仅在你指定时才会使用的外部扫描器)。解析、审计或重新验证服务的命令确实会访问公共 MCP 注册表和 npm——但不会有任何请求发往 mcpm 服务。
MCP 服务的风险不会在安装时显现,而是在 Agent 运行时出现:隐藏在工具输出中的提示词注入、在你批准后悄悄改写工具的服务,以及将指令偷偷塞进模型的采样请求。被列入注册表并不代表安全——2026 年,一个概念验证投毒服务被 11 个公共注册表和市场中的 9 个接受了。因此,mcpm 会为每次安装评分,检查硬编码密钥、提示词注入和仿冒拼写——然后在你的 AI 客户端与每个服务之间运行实时防护,固定工具定义以防 rug-pull,并在注入内容到达模型前将其拦截。
你不必只听我们的一面之词。 防护功能说起来容易,核验起来却难,因此衡量标准是公开的:mcp-guardbench 是一个与防护工具无关的基准测试——包含有版本管理的攻击和良性案例、开放式架构,以及一个可通过自身公开发布的 CLI 为任何 MCP 防护工具评分的运行器。mcpm 也和其他工具一样接受评分:通过 shell 调用 mcpm guard inspect,绝不导入自身引擎。
测试集不再是 mcpm 自己的测试样例。截至 corpus v5(57 个案例:33 个攻击案例、20 个良性案例、4 个警告后放行案例),其中包含 7 个根据第三方 MCP 服务中公开披露的真实 CVE 重建的案例,以及 3 个复现 Deadbugz 的案例。Deadbugz 是一场正在发生的 MCP 供应链攻击活动,其中第三个案例由外部贡献者 @vguillaume8 提供(见下文)。已发布的榜单首位显示:@getmcpm/[email protected] 的召回率为 86.5% / 误报率为 0.0% / 精确率为 100%;mcpm 的每一行结果都通过该版本公开发布的 CLI 测得。这只是一个基线,不是自夸——mcpm 的漏检项与命中项一起发布在同一页面上,其中包括全部 3 个源自 Deadbugz 的案例(见下文)。
差异所在。 Microsoft APM 是最接近的同类项目——它采用 npm 风格的安装器和锁文件,支持 9 个以上的 MCP 服务(以及技能/提示词/插件)客户端——但其文档明确指出,它的安装/审计关卡不会生成已签名的证明,将 Sigstore 验证列为范围外功能,至少要到 v0.2 才会纳入,其策略架构没有运行时权限或 Agent 沙箱相关字段。Smithery 于 2026-08-05 被 Arcade.dev 收购,提供的是托管执行路径,而非本地 CLI。像 McpVanguard 和 MCP Firewall 这样的开源运行时代理会在运行时检查并强制执行策略,MCP Firewall 还提供隔离功能——但两者都没有安装时信任评分或经 Sigstore 验证的供应链检查。(mcp-guardbench 中包含 McpVanguard 一行,但其 README 明确说明该行不能与 mcpm 的数据行比较,不应将其作为正面对比引用:它驱动的是一个离线测试框架层,而非 McpVanguard 的真实代理部署,并且对大约一半的语料不作判断。)mcpm 将信任评分、离线 Sigstore 来源验证,以及支持固定版本/检测偏移并具备操作系统隔离的运行时中继整合到一个本地、无需账户的工具中。
快速开始
使用你现有的包管理器安装:
| 方法 | 命令 |
|---|---|
| npm(全局) | npm install -g @getmcpm/cli |
| npx(无需安装) | npx @getmcpm/cli <command> |
| pnpm | pnpm add -g @getmcpm/cli |
| mise | mise use -g npm:@getmcpm/cli |
需要 Node ^22.22.2 || ^24.15.0 || >=26.0.0——也就是 22.22.2 及以上、24.15.0 及以上或 26 及以上,这是所有运行时依赖各自支持版本的交集。其他版本均不支持,包括 23.x 和 25.x。在 --engine-strict 下,npm 会发出 EBADENGINE 警告并直接失败;pnpm 则会静默安装并以 0 退出,除非你设置 engine-strict=true。因此在 pnpm 下,不受支持的 Node 会在运行时而非安装时导致错误。
可执行文件名为 mcpm。请注意: Homebrew 中的 mcpm Formula 是一个完全不同且无关的项目(mcpm.sh)——请使用上面的 npm/npx/pnpm/mise 安装此 mcpm(这些方式都会解析到带作用域的 @getmcpm/cli 包,因此不会发生名称冲突)。专用 Homebrew tap 暂未推出;请参阅 docs/DISTRIBUTION.md。
mcpm search filesystem
mcpm info io.github.domdomegg/filesystem-mcp
mcpm install io.github.domdomegg/filesystem-mcp
功能
搜索 MCP 注册表
查询官方 MCP 注册表,并查看带有信任指标的结果。
$ mcpm search filesystem
Name Description Version Transport Status
io.github.domdomegg/filesystem-mcp File system access via MCP 1.4.0 stdio active
io.github.Digital-Defiance/mcp-filesystem Read-only filesystem server 0.9.2 stdio active
...
搜索结果显示的是注册表生命周期状态,而非信任评分——它是一个快速发现列表,不会对每条结果单独运行扫描器。计算出的信任信息可通过 mcpm why、info、install 和 audit 查看。
经信任评估后安装
每次安装都会在写入配置前运行基于元数据的信任评估。
$ mcpm install io.github.domdomegg/filesystem-mcp
███████████████░░░░░ 57/80 CAUTION
├─ Health check: not yet run
├─ Tool descriptions: score 32/40
├─ Package: publisher verification passed
└─ External scan: not available (set MCPM_EXTERNAL_SCANNER for deeper analysis)
Install to Claude Desktop? (Y/n)
审核已安装的服务
扫描所有已安装内容。获取信任报告。
$ mcpm audit
┌─────────────────────────────────────────────┬─────────────────────────┬─────────────────┬──────────┐
│ Server │ Score │ Level │ Findings │
├─────────────────────────────────────────────┼─────────────────────────┼─────────────────┼──────────┤
│ servers-filesystem │ ████████░░ 62/80 │ clean · not run │ 0 │
├─────────────────────────────────────────────┼─────────────────────────┼─────────────────┼──────────┤
│ servers-github │ ████████░░ 60/80 │ caution │ 1 │
├─────────────────────────────────────────────┼─────────────────────────┼─────────────────┼──────────┤
│ servers-fetch │ ███████░░░ 52/80 │ caution │ 2 │
├─────────────────────────────────────────────┼─────────────────────────┼─────────────────┼──────────┤
│ some-sketchy-server │ ██░░░░░░░░ 16/80 │ risky │ 5 │
└─────────────────────────────────────────────┴─────────────────────────┴─────────────────┴──────────┘
4 servers scanned, 0 safe, 1 clean · not run, 2 caution, 1 risky
audit 从不执行服务,因此 30 分的健康检查部分固定得 15 分,最高只能得 62/80——这里没有任何服务能被评为 safe。通过所有实际运行检查的服务会显示为 clean · not run。servers-github 得分为 60,因为 npx -y 启动器会产生一条 low 安装脚本发现,这也是它显示为 caution 而非 clean · not run 的原因:该标签要求扫描未发现任何问题,而不只是得分处于最高档。
audit 也不会应用 why、install、up 和 lock 会应用的发布时效冷却发现(src/scanner/cooldown.ts 是安装门禁信号——它用于启用 install --min-release-age / policy.minReleaseAgeHours,而因服务已安装但发布时间较近就再次扣分,并不是 audit 要做的判断)。发布时间不到 24 h 的版本会因此被评为 medium,所以同一时刻对同一服务运行 mcpm audit,得分可能比 mcpm why 高 5 分。两个数字都没有错;它们回答的是不同问题。
跨 IDE 支持
一个工具,适用于你的所有 AI 客户端。mcpm 会为每个客户端读取和写入正确的配置格式。
$ mcpm list
Client Server Name Status Command/URL
Claude Desktop servers-filesystem active npx -y servers-filesystem
Claude Desktop servers-github active npx -y servers-github
Cursor servers-fetch disabled npx -y servers-fetch
Doctor:检查 MCP 设置的健康状况
查找配置错误、缺失的运行时、故障服务,以及粘贴到客户端配置中的明文密钥。
$ mcpm doctor
mcpm doctor
✓ Claude Desktop — config found, 3 servers
✗ Claude Code — config not found
✓ Cursor — config found, 1 server
✗ VS Code — config not found
✗ Windsurf — config not found
✗ Gemini CLI — config not found
Runtimes:
✓ npx available
✓ uvx available
✓ docker available
Cross-client (advisory):
⚠ servers-filesystem — in claude-desktop; missing in cursor
⚠ servers-github — in claude-desktop; missing in cursor
Run `mcpm sync --check` for the full matrix (advisory, not a failure).
Plaintext secrets (advisory):
⚠ claude-desktop · servers-github · env 'GITHUB_TOKEN' — GitHub token
Move env secrets to the encrypted store: `mcpm secrets set <server> <KEY>` or re-install with `--secrets keychain`.
No critical issues found.
明文密钥扫描只会报告密钥名称和标签,绝不会报告密钥值;已存储为 mcpm:keychain: 占位符的值会被跳过。该扫描仅提供建议(不会导致 doctor 失败)。
客户端生命周期兼容性
Cursor 的启用/禁用操作会在同一个全局配置文件中的 mcpm 所有停放映射表里保留定义;重新运行禁用操作可修复较早版本遗留的忽略标志。 这会影响后续发现,但不会停止正在运行的对等端,也不会覆盖项目本地定义。请参阅 Cursor 验证。 Gemini 的通用禁用标志和原生切换命令有经过实测的局限;请参阅 Gemini 验证。
Stack 文件:适用于 MCP 的 docker-compose
在 mcpm.yaml 中声明项目的 MCP 服务,使用信任快照锁定版本,并让每位团队成员通过一条命令复现设置。
mcpm export > mcpm.yaml # dump current setup
mcpm lock # resolve versions + trust snapshot
mcpm up # install everything from mcpm.yaml
mcpm diff # compare installed vs declared state
Stack 文件包含信任策略。如果某个服务的信任分数低于阈值,mcpm up 会阻止它。
锁文件会分别记录 MCP 发布版本和实际软件包版本。up 会在写入任何客户端配置前验证锁定的软件包元组,然后启动相应的 npm/PyPI 版本或显式指定的 OCI 标签/摘要。缺少软件包版本凭据的旧锁文件需要重新运行 mcpm lock。OCI 标签仍可变,完整性检查会比对注册表记录;mcpm 不会拦截软件包管理器在启动时下载的字节。
version: "1"
policy:
minTrustScore: 60
blockOnScoreDrop: true
servers:
io.github.domdomegg/filesystem-mcp:
version: "^1.0.0"
io.github.modelcontextprotocol/servers-github:
version: "1.2.3"
env:
GITHUB_TOKEN: { required: true, secret: true }
创建 Stack 文件模板
只需一条命令,即可为新项目创建 MCP 设置。mcpm init 会写入一个起始 mcpm.yaml,供你填入从 mcpm search 找到的服务。
$ mcpm init
Created mcpm.yaml.
Next steps:
mcpm search <query> find MCP servers in the registry
edit mcpm.yaml add them under `servers:`
mcpm lock resolve and lock versions
mcpm up install from the stack file
如果 mcpm.yaml 已存在,它会拒绝覆盖(传入 --force 可强制覆盖)。mcpm 特意不附带精选套件——为特定社区服务背书属于信任决策,安全工具不应将其预设其中。
信任分数
信任分数是根据公开可用的元数据进行的 0–100 分评估。它不是源代码审计。
检查项目:
| 组成部分 | 分值 | 衡量内容 |
|---|---|---|
| 健康检查 | 0–30 | 服务能否启动并响应 list_tools? |
| 静态扫描 | 0–40 | 基于正则表达式检测硬编码密钥、工具描述中的提示词注入模式、软件包名称中的仿冒拼写,以及可疑的参数架构 |
| 外部扫描器 | 0–20 | 来自你已安装的第三方扫描器的结果;通过 MCPM_EXTERNAL_SCANNER 选择启用(默认关闭) |
| 注册表元数据 | 0–10 | 已验证的发布者、发布日期、下载次数(存在严重发现时分数会降至 0) |
等级是可用分数的比例,而非绝对分数:达到 maxPossible 的 80% 或以上为安全,50-79% 为谨慎,低于 50% 为高风险。如果没有外部扫描器(maxPossible 为 80),那么 64 分就达到安全等级,而不是 80 分。 |
mcpm audit 会显示 clean · not run,表示服务器通过了所有实际运行的检查,唯一未测量的部分是健康检查——审计不会执行服务器,因此该项固定得 15/30 分,否则会把每台毫无问题的服务器都拉入谨慎等级。这说明的是 mcpm 做了什么(没有发现问题,也没有运行服务器),其标准刻意低于安全;只有实际运行了健康检查的服务器才能获得安全等级。
没有外部扫描器时,最高可能得分为 80/100,该项会从总分中剔除,而不是计为失败。静态扫描可以发现常见模式,但无法检测所有漏洞。请将分数视为一个信号,而非保证。
外部扫描为可选功能,mcpm 永远不会下载扫描器。 将 MCPM_EXTERNAL_SCANNER 设为你已安装的扫描器的路径或名称。mcpm 会通过 <scanner> --version 探测它;如果命令以 0 退出,就会使用 <scanner> --json <server-name> 扫描每台服务器,并要求其在 stdout 上输出 {"findings": [...]}。无法读取输出的扫描器会被视为缺失,而非通过检查,因此该项会从总分中剔除,而不会悄悄获得 20/20 分——否则,任何以 0 退出的二进制文件都会提高信任分数。
软件包运行器(npx、uvx、pipx、docker、shell 等)都会被拒绝,包括通过符号链接或运行器的 -cli.js 入口点调用的情况。请明确这一防护的作用:它是一个防误操作护栏,而非安全边界。任何能设置此变量的人,通常也能设置 PATH 或放入一个文件。它的作用是确保复制粘贴的 npx … 操作步骤——或未来 mcpm 默认设置再次偏向此类操作——不会悄悄重新引入当初重构这一接口以移除的“获取并执行”攻击路径。
这里不推荐任何扫描器,因为目前评估过的都不合适:snyk/agent-scan(Invariant Labs 的 mcp-scan 的积极维护后继项目)确实接受裸注册表坐标作为输入,但它会将该坐标转换为 npx/uvx/docker run 调用,并启动服务器进行实时检查——这与 mcpm 的“先安装、后验证”设计相冲突,因为它会在两个调用点(安装、锁定)运行,而此时你还没有决定是否安装;此外,它还要求 Snyk 账号和 SNYK_TOKEN,且没有离线模式。完整评估请参阅 src/scanner/tier2.ts 文件头的注释。
这 20 分会影响评分,但无法越过安全底线。 MCP 服务接口(mcpm_install、mcpm_up、mcpm_setup)强制执行 25 分的硬性信任底线,任何调用方提供的值都不能降低此底线——而且由于 MCPM_EXTERNAL_SCANNER 指向任意可执行文件,打印 {"findings": []} 的两行脚本也属于调用方提供的输入。因此,底线只会依据 mcpm 自身的证据进行比较:健康检查 + 静态扫描 + 注册表元数据,共计 80 分。这种排除是单向的:如果扫描器报告严重发现,服务器仍会因为信任底线而被扣分(通过注册表元数据上限),只是扫描器无法借此提高分数。你自己的 --min-trust 阈值、堆栈文件的 policy.minTrustScore 和 mcpm audit --fix 不受影响:在这些情况下,同一个人会同时选择阈值和扫描器。audit --fix 也是唯一一个会删除而非拒绝的分数门槛,因此在这里剔除该项会移除更多服务器,而非更少。
命令
| Command | Description |
|---|---|
mcpm search <query> | 在 MCP 注册表中搜索服务 |
mcpm install <name> | 从注册表安装 MCP 服务 |
mcpm info <name> | 显示 MCP 服务的完整详情 |
mcpm list | 列出所有检测到的 AI 客户端中已安装的 MCP 服务 |
mcpm remove <name> | 从客户端配置中移除 MCP 服务 |
mcpm audit | 扫描所有已安装的服务并生成信任报告(--json、--sarif 可用于 GitHub 代码扫描) |
mcpm update | 检查是否有更新版本,并更新已安装的服务 |
mcpm outdated | 显示已安装服务的版本差异(如需查看当前安全发现,请使用 mcpm audit) |
mcpm secrets | 管理 MCP 服务凭据(静态数据使用 AES-GCM 加密;密钥保存在操作系统密钥链中——macOS Keychain / libsecret / Windows DPAPI——因此复制的存储无法在其他机器上解密;若没有可用的密钥链,则回退到由机器派生的密钥)。mcpm secrets migrate 可升级较早版本的条目 |
mcpm publish scaffold | 以交互方式创建 .mcpm-publish.yaml 清单 |
mcpm publish check | 试运行:显示信任评分和将要提交的内容(--json 会输出确切的请求正文) |
mcpm publish | 提交到官方 MCP 注册表(需要 GITHUB_TOKEN/MCPM_TOKEN,或在 GitHub Actions 中使用 --github-oidc 并设置 id-token: write) |
mcpm doctor | 检查 MCP 设置的健康状况并报告问题(--json 输出结构化模型,--report 输出已脱敏、可粘贴到错误报告中的快照) |
mcpm init | 在当前目录中创建入门用的 mcpm.yaml 堆栈文件 |
mcpm disable <name> | 禁用 MCP 服务,但不从配置中移除 |
mcpm enable <name> | 重新启用之前已禁用的 MCP 服务 |
mcpm import | 从客户端配置文件导入现有的 MCP 服务 |
mcpm alias | 为较长的 MCP 服务名称创建短别名 |
mcpm export | 将已安装的服务导出为 mcpm.yaml 堆栈文件 |
mcpm lock | 解析版本并创建 mcpm-lock.yaml,其中包含信任快照(以及 npm 来源身份信息;版本差异会显示 WARN) |
mcpm up | 通过信任验证,从 mcpm.yaml 安装所有服务 |
mcpm verify | 仅用于仓库的 CI 门禁:验证锁文件完整性,并根据 npm 已发布的记录重新验证 Sigstore 来源(--json) |
mcpm diff | 将已安装的服务与 mcpm.yaml 和锁文件进行比较 |
mcpm sync | 显示所有已检测客户端之间的配置差异(--check 可通过退出码 2 在 CI 中设置门禁,--json) |
mcpm completions <shell> | 生成 shell 补全脚本(bash、zsh、fish) |
mcpm why <name> | 说明服务的信任评分(列出所有组成部分的细分情况) |
mcpm serve | 将 mcpm 作为 MCP 服务启动(stdio 传输) |
mcpm guard enable | 使用检查中继封装检测到的客户端配置 |
mcpm guard disable | 恢复原始客户端配置 |
mcpm guard status | 显示已封装的内容以及各服务的固定状态 |
mcpm guard demo | 运行合成提示词注入场景(显示拦截提示) |
mcpm guard accept-drift <server> | 在合法升级后重新固定工具的架构 |
mcpm guard mute <signature-id> | 禁用某个签名;可选使用 --for <duration> 指定时长 |
mcpm guard unmute <signature-id> | 重新启用已静音的签名 |
mcpm guard pause | 暂停所有 Guard 检查(用于调试的应急开关) |
mcpm guard cleanup | 清理未安装服务的固定项 |
mcpm guard inspect [file] | 离线运行签名目录,检查 MCP JSON-RPC 帧;无需中继或服务 |
mcpm guard list-signatures | 显示随附的 OWASP MCP Top 10 签名目录 |
mcpm guard doctor-confine | 报告沙箱后端的可用性,以及哪些服务已加入隔离(--json) |
mcpm guard reset-integrity | 重新生成 pins.json 或 guard-policy.yaml 完整性旁文件 |
运行 mcpm <command> --help 查看选项和标志。
CI:验证你的锁定文件
mcpm verify 是仅针对仓库、无需客户端的检查关卡:它会将已提交的
mcpm-lock.yaml 与 npm 的已发布 dist.integrity 记录进行比对;如果完整性发生
偏差、记录无法验证、格式不匹配,或缺少可疑的基准记录,就会以非零状态码退出。由于
无需安装任何 AI 客户端,它可以在托管式 CI 运行器上运行(而 mcpm up 无法在此运行)。
它还会检查锁定文件是否覆盖 mcpm.yaml 中声明的内容。其他检查关卡只读取锁定文件,
因此缺少服务的锁定文件也能通过;覆盖检查可以防止截断的锁定文件在实际执行的检查少于
你要求的内容时仍验证通过。锁定文件中完全没有服务时,只有在它旁边的 mcpm.yaml
确认未声明任何内容,才会通过。相应地,mcpm lock 采用全有或全无的方式:如果有任何
服务无法解析,它会报告所有故障并且不写入任何内容,保留先前的锁定文件。
它还会对锁定文件中记录了经密码学验证基准的每个 npm 服务,重新验证 Sigstore 来源
证明:针对 npm 当前记录重新运行离线加密验证;如果证明状态退化——签名者身份发生变化、
验证不再通过,或无法重新检查——就会以失败关闭。此检查受证据门控,因此没有
verified 基准记录的锁定文件(常见情况)不受影响。mcpm up --frozen 会在安装前运行
相同的完整性与来源证明冻结检查。
mcpm lock 还会记录每个 npm 服务的已发布来源身份(源码仓库,以及构建所依赖的不可变
GitHub 仓库/所有者 ID),并在不同版本之间发生变化时发出警告——例如仓库/所有者变更
或从已签名变为未签名,这是被劫持的发布(Postmark)攻击的典型特征。
mcpm lock 和 mcpm why 还会以密码学方式离线验证来源证明:使用随附的信任根
(验证时无需联网)检查证明中的 Sigstore bundle,并将经证明的主题摘要绑定到软件包的
dist.integrity,因此针对不同 tarball 的有效证明无法通过验证。验证通过时,记录为
verified;否则记录为 attested——即未经验证的注册表记录——或 unsigned(中性)。
此检查仅用于报告,并明确说明其范围:verified 表示 CI 的 OIDC 令牌已通过密码学方式证明
构建身份——不表示代码安全(同一仓库中的 CI 遭到破坏也能生成有效证明)。
# .github/workflows/mcpm.yml
jobs:
verify:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: getmcpm/cli/.github/actions/[email protected] # or: run: npx @getmcpm/cli verify
该 Action 会根据 --json 输出作业步骤摘要;同一命令也可用作
pre-commit 钩子。请参阅 .github/actions/mcpm-verify。
代码扫描: mcpm audit --sarif 会生成 SARIF 2.1.0 报告(每种发现类型对应一条规则,
发现项锚定到 mcpm.yaml 文件级别),供 GitHub 接收并作为代码扫描警报:
- run: npx @getmcpm/cli audit --sarif > mcpm.sarif
continue-on-error: true # audit exits 1 when a server is risky
- uses: github/codeql-action/upload-sarif@v3
if: always() # upload even if the audit flagged a risk
with:
sarif_file: mcpm.sarif
当服务存在风险时,mcpm audit 以 1 退出;当调用本身无法满足要求时,以 2 退出——
例如不可能实现的 --min-trust,或 mcpm 拒绝的标志组合(--sarif 仅用于报告,不能与
--fix 同时使用)。如果脚本将所有非零退出状态都视为“服务有风险”,就会误读第二种情况。
诚实边界:失败表示 npm 的已发布记录与锁定文件不一致——并不表示 mcpm 捕获到了恶意 字节;npx/uvx 会在服务启动时独立获取构件。
运行时防御(mcpm-guard)
v0.47.0 防护兼容性更新会检查现代 MCP 发现机制,以及嵌入式采样/引导请求。遇到未知的嵌入式请求形式时会发出覆盖范围警告。有关准确的 stdio 边界和剩余缺口,请参阅协议覆盖矩阵。
v0.47.1 为固定版本的已发布 v0.47.0 基线和官方 SDK v1/v2 对等端新增了可复现的沙盒兼容性测试框架。其命名的 stdio 矩阵在 Linux/arm64 和 Linux/amd64 上通过;该矩阵不会测试已安装的原生客户端或完整的协议一致性。运行时行为没有变化。
v0.47.2 为固定版本的 VS Code 和 Claude Code 构建版本,在一次性 macOS 虚拟机中新增了仓库的原生客户端冒烟测试套件。其已发布的 mcpm 基线仍为 0.47.1。该套件使用合成输入测试实际的全局配置和 MCP 调用;实时模型、交互式聊天以及其他客户端/平台组合需要单独测试。
v0.47.7 通过将定义移出活动服务器映射,修复了 Cursor 全局禁用问题。请重新运行禁用操作,以修复旧的忽略标记。经审查的候选版本通过了 8 个 Cursor CLI 测试用例;Gemini 连接验证记录了 7 项通过,以及 3 项明确的切换限制。v0.47.7 发布版本已在 npm 和官方注册表上完成验证,包括实际 tarball 完整性、来源证明、签名 SBOM 和全新安装检查。
v0.47.5 新增了仅限候选版本的原生工作区/服务器信任验证:在固定版本的 VS Code 和 Claude Code 中各测试 4 个用例,并包含由 Astra 审核的证据检查。应用源代码和依赖项与 v0.47.4 相比没有变化。
v0.47.4 刷新了依赖锁定文件以及固定版本的构建/安全 Actions,同时保留全部 9 项安全覆盖。应用源代码和兼容性声明没有变化;原生/参考测试基线仍明确固定。
v0.47.3 修复了 VS Code 用户全局 JSONC 配置编辑问题,确保无关注释/设置和原始备份在 MCP 生命周期内得以保留。该版本还新增了独立的原生批准/拒绝测试:在固定版本的 VS Code 和 Claude Code 构建版本中各测试 4 个用例,并使用合成模型响应。之后,仅限候选版本的 Phase 2D 套件在两个固定版本客户端中验证了工作区/服务器信任:当导入的服务器定义发生变化时,VS Code 会再次提示;Claude Code 2.1.296 则会按项目服务器名称保留批准状态,不会再次提示。行内聊天/Agent Host、macOS 原生对话框和实时提供方仍未验证。
安装时的信任评分可以在大多数恶意服务器发布前将其拦截。但如果遇到突然变卦呢——服务器在你已批准之后更改了工具定义?或者工具响应中的提示注入呢——智能体通过你信任的 MCP 服务读取 Slack 消息、网页或日历邀请时,其中可能包含恶意文本?
mcpm guard 增加了运行时检查层。它通过 stdio 中继封装每个已安装的 MCP 服务,扫描工具描述/响应/参数中的 OWASP MCP Top 10 攻击模式,在安装时固定每个工具的架构,并在实时响应偏离固定版本时阻止调用(防范突然变卦)。
每次工具调用时会发生什么
防护器内联部署在 AI 客户端与各 MCP 服务之间的 stdio 通道上,因此每次工具调用的请求和响应两部分都会经过它并受到检查:
- Agent 发送的请求 — 工具名称和参数会经过检查,以发现敏感路径外泄,以及藏在调用参数中的注入内容。
- 服务返回的响应 — 会检查工具输出中隐藏的指令注入(例如 Agent 即将读取的 Slack 消息、网页或日历邀请)。
- 工具自身的定义 — 会检查
tools/list描述、架构和注释,并与批准时固定的架构进行比对,避免服务悄悄改写你已经信任的工具。
当某个帧触发签名、漂移检查或策略规则时,防护器会丢弃该帧,并用 JSON-RPC 错误替代后传给你的 Agent——其中包含签名 ID 和 remediation 字符串——因此有毒内容不会到达模型。未触发问题的调用会直接通过(小帧的 p99 约为 0.065 ms)。服务发起的 sampling / elicitation 请求也会以同样方式接受检查,但错误会路由回服务,而不是传给你的 Agent。
快速开始
npm install -g @getmcpm/cli@latest
mcpm guard enable # wrap detected client configs (Claude Desktop / Claude Code / Cursor / VS Code / Windsurf / Gemini CLI)
# → restart your IDE so it re-spawns the wrapped server processes
mcpm guard demo # synthetic prompt-injection scenario — see a live block in your terminal
mcpm guard status # what's protected, what's still in first-session-pin mode
demo 命令会启动一个进程内的合成恶意服务,该服务会返回预设的提示词注入载荷;中继会拦截它。从 npm install 到截屏展示拦截结果,总共约需 5 分钟(大部分时间花在重启 IDE 上)。
能拦截的内容
分类依据是 mcpm 在 src/guard/owasp.ts 中固定的 OWASP MCP Top 10(beta) ID;固定的规范提交及各项分类的依据见 docs/owasp-mcp-mapping.md。unclassified 表示该签名已通过评估,但在该提交对应的分类中没有明确归属,而不是尚未审核。
| 类别 | 攻击类型 | 操作 |
|---|---|---|
| MCP03 工具投毒 | 工具描述注入(投毒) | 阻止 |
| MCP03 工具投毒 | 工具注释(标题或自定义注释字段)中的指令式文本 | 阻止 |
| MCP03 工具投毒 | 自安装以来的架构/注释漂移(诱饵掉包) | 阻止 |
| MCP03 工具投毒 | 仅描述内容漂移(外观层级) | 警告 |
| MCP03 工具投毒 | 工具响应中的指令注入 | 阻止 |
| MCP03 工具投毒 | 工具输入架构中带有外传含义的参数(_system_prompt_、……) | 阻止(列出时) |
| MCP03 工具投毒 | 工具元数据中的任何不可见字符(Default_Ignorable_Code_Point)或控制字符——零宽字符、双向文本控制字符、组合附加符连接符、填充符、变体选择符、Unicode TAG 块——但单个跟在表情符号、键帽符号、ZWJ 表情符号序列和三个 RGI 区域旗帜之后的 VS15/VS16 除外 | 警告 |
| MCP03 工具投毒 | 任意载体中的 U+E0000–U+E007F 隐藏载荷(“ASCII 走私”) | 解码后重新扫描——由恢复出的特征决定;仅存在此类字符时也会触发最低限度警告 |
| MCP03 工具投毒 | 单次 tools/list 中公布的两个工具名称在规范化后视觉上无法区分 | 警告 |
| MCP03 工具投毒 | 工具元数据以外出现两个或更多变体选择符(“表情符号走私”;仅检测是否存在,不解码) | 警告 |
| MCP03 工具投毒 | 工具名称中含有不可见或零宽字符(无例外),或混用拉丁字母与其他文字系统 | 警告 |
| MCP06 意图流劫持 | initialize 指令中的注入(换行跳转) | 阻止 |
| MCP06 意图流劫持 | 资源/提示词内容中的指令注入 | 警告(转发) |
| MCP06 意图流劫持 | 服务请求钱包助记词/私钥/银行卡 CVV/SSN/PIN | 阻止(发往服务) |
| MCP06 意图流劫持 | 服务发起的 sampling 提示词中的注入 | 阻止(发往服务) |
| MCP05 命令注入与执行 | 标识符或路径格式的 tools/call 参数中包含 Shell 元字符/命令替换语法(CVE-2025-53818、CVE-2026-25546 类型) | 阻止 |
| MCP05 命令注入与执行 | 表名/列名/数据库名称格式的参数中包含查询语言控制语法(CVE-2026-33980 类型) | 阻止 |
| MCP05 命令注入与执行 | 命名空间或不透明标识符格式的参数中嵌入以 -- 开头的 CLI 标志令牌(CVE-2026-39884 类型) | 阻止 |
| MCP01 令牌管理不当与秘密泄露 | 工具响应中返回高置信度秘密 | 警告(在日志中对秘密进行编辑) |
| MCP01 令牌管理不当与秘密泄露 | 工具响应中泄露通用承载令牌 | 警告(在日志中对秘密进行编辑) |
| MCP02 通过范围扩张提升权限 | 服务公布的能力在 initialize 握手期间发生变化 | 警告(一次) |
| 未分类 | 工具参数中的敏感路径外传 | 警告(可通过策略提升为阻止) |
| 未分类 | 工具响应中的 HTML/脚本调用 electron.mcp 特权 IPC 桥接(CVE-2025-68669、CVE-2026-22793 类型) | 警告 |
检测结合了正则表达式和结构分析;NFKC 规范化 + 去除所有 Unicode 默认可忽略码点(并将空白宽度填充符折叠为空格)可抵御常见的 Unicode 规避手段,此外还会单独检查隐藏字符是否存在,以便在它们被规范化移除之前标记这些规避载体。"ASCII smuggling"——将载荷隐藏在 Unicode TAG 区块(U+E0000-U+E007F)中;它渲染为空白,但模型可以读取——会经过两轮专门检测,因为移除这些字符会抹去完整编码的载荷,而不是揭示它。防护机制会将 TAG 字符串解码回 ASCII,并重新运行载体自身的特征签名,因此会根据隐藏载荷的实际内容进行判定:以 TAG 编码的钱包种子索取内容会被凭据钓鱼特征签名拦截,而不只是标记为可疑。除此之外,还有一个存在性底线,用于处理隐藏后不匹配任何特征签名的载荷。Emoji 地区旗帜也由相同的码点构成,因此通过验证完整序列,将客户端实际渲染的三个旗帜(英格兰、苏格兰、威尔士)排除在外;其他格式正确的地区旗帜仍会触发警告。服务器响应中的 Base64 / base64url 载荷也会被解码并重新扫描,因此隐藏在编码之后的注入内容或凭据无法绕过正则检测底线(Base64 解码后命中的内容会触发警告,不会被强制拦截;TAG 解码后命中的内容则保持其原生严重级别,因为正常内容不会在该编码层隐藏信息)。当前随附的特征签名集请参阅 mcpm guard list-signatures。 |
隔离(选择启用的强制执行)
上述内容都是检测——中继会分析 JSON-RPC 字节并发出警告或拦截。但如果服务决定读取 ~/.ssh 或写入 ~/Library/LaunchAgents 持久化钩子,这类行为永远不会通过可检查的流量表现出来。mcpm guard enable --confine 将强制执行与检测结合起来:它会将每个通过中继的 stdio 服务置于 OS 沙箱中,物理阻止其读取秘密文件拒绝列表中的文件,并阻止其在缓存或临时目录以外写入,从而确保服务无法窃取凭据或建立持久化机制,无论它发送什么 JSON-RPC 内容。mcpm guard doctor-confine 会报告后端的可用性以及已纳入隔离的服务。目前仅支持 macOS(Seatbelt/sandbox-exec);在其他平台上,它会发出警告并以非隔离模式运行,而不会让人误以为受到保护。有关各层级的详情和注意事项,请参阅 docs/GUARD.md。
第一天常用命令
mcpm guard enable [--client <name>] [--server <name>] [--dry-run] # wrap detected configs
mcpm guard disable [--client <name>] [--server <name>] # unwrap
mcpm guard status # what's wrapped + pin state
mcpm guard demo # synthetic attack-block demo
mcpm guard list-signatures [--json] # show shipped signatures
mcpm guard inspect frames.ndjson # verdicts for captured traffic, offline
mcpm guard enable --confine # also OS-sandbox wrapped stdio servers (macOS)
mcpm guard doctor-confine [--json] # confine backend availability + enrolled servers
无需服务即可检查帧
mcpm guard inspect 会对你已有的 MCP JSON-RPC 帧(捕获的响应、可疑的 tools/list、文章中的载荷)运行中继所用的同一套特征签名目录,无需包装服务、中继或网络:
# one frame, human-readable
mcpm guard inspect suspicious-response.json
# a capture, machine-readable — one verdict line per input frame, in input order
cat frames.ndjson | mcpm guard inspect --json
退出状态可用作针对已记录流量的 CI 门禁:0 表示一切正常,1 表示有内容触发警告(或某个帧无法解析或检查),2 表示有内容会被拦截。
判定结果使用特征签名目录的默认操作,包括仅警告的载体限制——因此,resources/read 正文中的注入内容在此处会报告为 warn,与在线检查时完全相同。不会应用本地策略覆盖项(静音项、log_only):它回答的是“特征签名会检测到什么”,而不是“我的配置会如何处理”。
这也是 mcp-guardbench 用来评估 mcpm 防护机制的接口——通过这个已发布的二进制文件,而不是导入引擎,因此 mcpm 的评估条件与任何其他防护机制完全相同。mcp-guardbench 是一个参考用户:它提供与防护机制无关的语料库和运行器,可用这种方式评估任何 MCP 防护机制。
触发拦截时
中继会向你的 IDE 返回 JSON-RPC 错误响应,其中包含特征签名 ID 和 remediation 字符串,明确告知你要运行哪个命令。以下是两个典型情况:
# False positive on a legitimate signature
mcpm guard mute owasp-mcp-2-instruction-injection-in-response --for 5m
# Schema drift on a legitimate server upgrade
mcpm guard accept-drift slack-mcp --tool send_message --new-hash sha256:abc... --yes
审查日志
每次拦截或警告都会追加到 ~/.mcpm/guard-events.jsonl。使用 jq 检查:
# Last hour's blocks
tail -n 1000 ~/.mcpm/guard-events.jsonl | jq 'select(.action == "block")'
# Group by signature id
jq -s 'group_by(.findings[0].signature_id) | map({sig: .[0].findings[0].signature_id, n: length})' \
< ~/.mcpm/guard-events.jsonl
# Top-N most-blocked servers
jq -s 'group_by(.server_name) | map({server: .[0].server_name, n: length}) | sort_by(-.n) | .[:10]' \
< ~/.mcpm/guard-events.jsonl
调试时需要暂时关闭它
mcpm guard pause --for 10m # disables all inspection for 10 minutes
mcpm guard pause --off # cancel an active pause
为什么需要它
这套防护措施所做的每件事都有独立的 2026 年证据支持,让你可以核实其依据,而不是轻信宣传:
- NSA AI Security Center,《MCP:安全设计注意事项》 — 建议使用出站代理过滤、数据丢失防护、沙箱和本地 MCP 扫描。这些做法分别对应守卫中继、凭据外传检测器、
--confine和mcpm audit,都收录在同一份政府文件中。 - OX Security,《AI 供应链之母》(2026-04-15)— 由“配置转进程启动”设计引发的 10 个已分配严重/高危 CVE,以及一个概念验证:有毒服务器被 11 个公共注册表和市场中的 9 个接受。列入注册表并不代表安全。
- Microsoft 对工具投毒的警告(2026-06-30,此处报道)— 被投毒的工具描述对 Agent 的引导效果,几乎相当于重写其系统提示词;建议采取类似代码审查的方式,对描述变更进行差异比较。Schema 固定加漂移检测涵盖了检测环节:mcpm 会告知你描述自获批后发生了变化,并在 schema 或注释发生漂移时拦截。但它不会呈现文本的变更前后差异。
- SmartLoader(2026 年 2 月披露)— 一个被植入木马的 Oura Ring MCP 服务,借助伪造的 GitHub 账号营造虚假的社会认同,混入合法注册表以投放信息窃取程序。星标和列表都可以伪造,因此
mcpm lock、why和verify会检查构建来源(相关事件在此处报告并纳入门控,而不是计入信任评分)。请注意其明确的局限:来源证明证实的是谁构建了软件包,并不能证明代码安全——攻击者从自己的 CI 发布自己植入木马的软件包,也能获得有效的来源证明。它提高了冒充他人的成本,但本身无法阻止 SmartLoader。 - Deadbugz(Pillar Security,2026-08-12 披露)— 一场仍在进行的 MCP 供应链攻击活动:同一个 GitHub 账号向互不相关的 AI/MCP/开发工具项目提交了 23 个拉取请求,分发一款服务器。该服务器在前三次工具调用中保持正常,之后会篡改其
tools/list和prompts/get响应,以索取 SSH 密钥、AWS 凭据、shell 历史记录和 Kubernetes 配置。mcpm 基于会话的 schema 漂移检查会在真实会话中拦截tools/list篡改(它会与会话中首次出现的定义进行比较,而不只是检查磁盘上的固定值)——但 mcp-guardbench 中,对该措辞进行了三次单帧、无上下文复现——包括第三种由外部贡献、针对真实 mongodb-mcp-server 工具界面的变体——在@getmcpm/[email protected]中均为已发布的漏检(措辞与当前的正则表达式特征不匹配);而且 mcpm 自身的测试记录显示,该攻击活动还会投毒的prompts/get通道完全没有漂移防护(src/guard/__tests__/deadbugz.test.ts)。 - Grafana MCP,CVE-2026-19516(Pillar Security,2026-09-02;Grafana 安全公告,CVSS 9.1,已在 v1.1.0 中修复)— v1.1.0 之前的
mcp-grafana存在会话欺骗和 SSRF 漏洞,未认证的调用者可伪造符合预期格式的会话,利用服务器自身的 Grafana 凭据执行操作;随后还可通过调用者提供的X-Grafana-URL请求标头,将服务器的grafana_api_request工具指向内部服务和云元数据服务。该 CVE 编号涵盖 SSRF 部分;同一研究还发现了一个相关的认证缺口,而 v1.1.0 为此新增的 bearer-token 认证是可选的。明确说明其局限:这是一个远程 HTTP/SSE 服务,而 mcpm 的守卫中继仅支持 stdio——面对 HTTP/SSE 传输时会安全失败(拒绝包装),而非为其提供防护。 - Context7,CVE-2026-75130(发布于 2026-08-18;分配方根据 CVSS 4.0 将其评为中危 6.4,根据 CVSS 3.1 将其评为严重 9.0)— Upstash 广泛使用的文档服务存在提示词注入漏洞(约 50k 个 GitHub 星标,npm 下载量超过 8M):其 Custom AI Instructions 功能可在常规的库文档请求中,将未经净化的文本注入已连接的编码 Agent 上下文,从而导致凭据外传和破坏性文件删除。该漏洞已修复——报告者的分析文章记录了 2026-02-18 的私下披露,以及 2026-02-23 部署到 Context7 生产服务的修复,比 CVE 发布早了数月。这里值得注意的是:修复针对的是服务提供这些指令的方式,因此已安装软件包上的版本固定或锁文件条目都无法发挥作用。
- 官方注册表自身的审核政策 — 消费者“应假设审核极少或没有审核”,安全扫描则明确交由软件包注册表和下游子注册表负责。mcpm 正是这些下游层之一。
阅读更多
docs/GUARD.md— 完整的命令参考docs/SIGNATURES.md— 特征目录,以及如何贡献新特征docs/POLICY.md—~/.mcpm/guard-policy.yaml参考docs/owasp-mcp-mapping.md— 将每种 mcpm 机制映射到 OWASP MCP Top 10(测试版)类别,并如实列出未覆盖的内容docs/VISION.md— 项目的发展方向(论点、阶段、原则)
Agent 模式
mcpm 本身可以作为 MCP 服务运行,让 AI Agent 以编程方式搜索、安装和审计 MCP 服务。
{
"mcpServers": {
"mcpm": {
"command": "npx",
"args": ["-y", "@getmcpm/cli", "serve"]
}
}
}
这会公开 9 个工具:mcpm_search、mcpm_install、mcpm_info、mcpm_list、mcpm_remove、mcpm_audit、mcpm_doctor、mcpm_setup 和 mcpm_up。
在 v0.46.0 中: search/info 除了现有的 JSON 文本外,还会公开带版本的结构化证据:生命周期状态、发现项、评分的分母/上限,以及已执行或未运行的检查。评分不代表安全概率,未运行的检查也不代表通过。verify --json 保留现有的带版本覆盖范围和故障模型。请参阅稳定性契约和Agent 工作流。
mcpm_setup 工具接受类似“filesystem and GitHub”的自然语言描述,并处理所有操作:搜索、信任评分和安装。只需调用一次工具,即可组建可用的 MCP 工具链。
试试看——将上面的配置添加到 MCP 客户端,重启,然后向 Agent 提问:
使用 mcpm 查找用于访问文件系统和 GitHub 的 MCP 服务。说明它们的发现项、生命周期状态和未运行的检查。安装前展示拟议的配置更改。
仓库包含一个可移植的 mcpm 使用技能。 请从经过审查并固定版本的仓库检出中,将其安装到客户端的技能目录; 它不包含在 npm 包中。它不包含脚本、钩子、权限授权、模型订阅或外部决策服务。
支持的客户端
| 客户端 | 配置路径(macOS) |
|---|---|
| Claude Desktop | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Claude Code | ~/.claude.json(用户全局 mcpServers) |
| Cursor | ~/.cursor/mcp.json |
| VS Code | ~/Library/Application Support/Code/User/mcp.json |
| Windsurf | ~/.codeium/windsurf/mcp_config.json |
| Gemini CLI | ~/.gemini/settings.json(用户全局 mcpServers) |
VS Code 的托管 mcp.json 支持 JSONC 注释和尾随逗号。更改会编辑所选服务,同时保留无关设置/注释和原始备份。
其他客户端仍使用严格的 JSON 解析。变量引用会保留,由客户端解析。
这些适配器不管理可移植/工作区配置和 Copilot Agent Host 配置路径;请参阅
原生验证范围。
也支持 Linux 和 Windows 路径。请参阅 mcpm doctor,以确认系统检测到哪些客户端。
工作原理
mcpm 是一款本地优先的 CLI。mcpm 没有后端或账户系统。
flowchart TD
subgraph user["User / Terminal"]
CLI["mcpm CLI<br/>Commander entry point"]
end
subgraph commands["Commands (src/commands/)"]
SEARCH["search"]
INSTALL["install"]
AUDIT["audit"]
GUARD["guard<br/>enable/disable/status"]
end
subgraph registry["Registry API<br/>(Only Remote)"]
REGAPI["https://registry.<br/>modelcontextprotocol.io<br/>v0.1"]
end
subgraph scanning["Local Scanning & Trust<br/>(src/scanner/)"]
HEALTH["Health Check<br/>(0-30): spawn +<br/>verify response"]
TIER1["Tier 1: Static Patterns<br/>(0-40): secrets, injection,<br/>typosquatting, exfil"]
TIER2["Tier 2: External Scan<br/>(0-20): opt-in via<br/>MCPM_EXTERNAL_SCANNER"]
META["Registry Metadata<br/>(0-10): publisher,<br/>age, downloads"]
SCORE["Trust Score<br/>(max 80; 100 with<br/>external scan)"]
end
subgraph config["Config Management<br/>(src/config/adapters/)"]
DETECT["Detect AI clients<br/>Claude Desktop / Claude Code / Cursor<br/>VS Code / Windsurf / Gemini CLI"]
ATOMIC["Atomic writes<br/>0o600 + symlink-safe<br/>.tmp/.bak"]
end
subgraph guard_runtime["Guard Runtime<br/>(src/guard/)"]
WRAP["Config entry wrap<br/>via run --inner"]
RELAY["Stdio MITM Relay<br/>per-server"]
PATTERNS["Pattern Engine<br/>OWASP MCP Top 10"]
PINS["Schema Pins<br/>+ Drift Detection"]
FAILCLOSED["Fail-closed on<br/>pins.json error"]
EVENTS["Event Log<br/>guard-events.jsonl"]
end
subgraph local_state["Local State<br/>(~/.mcpm/)"]
SERVERS["servers.json"]
ALIASES["aliases.json"]
SECRETS["secrets.enc.json"]
PINS_STORE["pins.json"]
POLICY["guard-policy.yaml"]
end
subgraph clients["Native AI Clients"]
CD["Claude Desktop"]
CC["Claude Code"]
CURSOR["Cursor"]
VSCODE["VS Code"]
WINDSURF["Windsurf"]
GEMINI["Gemini CLI"]
end
CLI --> commands
commands -->|searchServers| REGAPI
commands -->|scan| HEALTH
commands -->|scan| TIER1
commands -->|if available| TIER2
commands -->|registry meta| META
HEALTH --> SCORE
TIER1 --> SCORE
TIER2 --> SCORE
META --> SCORE
commands -->|detect| DETECT
commands -->|merge & write| ATOMIC
DETECT -->|config paths| clients
ATOMIC -->|config| clients
GUARD -->|wrap| WRAP
WRAP -->|modifies config<br/>to invoke| clients
WRAP -->|setup| RELAY
RELAY -->|parse frames<br/>inspect msg| PATTERNS
PATTERNS -->|check pins| PINS
PINS -->|read| PINS_STORE
PATTERNS -->|read policy| POLICY
PINS -->|fail-closed| FAILCLOSED
RELAY -->|record| EVENTS
commands -->|store| SERVERS
commands -->|aliases| ALIASES
commands -->|secrets| SECRETS
- 搜索和安装会查询由 Model Context Protocol 项目维护的官方 MCP Registry API(v0.1)。
- 信任评估在本地使用内置扫描器(基于正则表达式的模式检测)运行,也可以额外调用已安装且通过
MCPM_EXTERNAL_SCANNER指定的第三方扫描器。 - 配置管理会读取并写入每种 AI 客户端的原生配置文件。所有写入都使用受限权限的原子文件操作(文件权限为 0o600,目录权限为 0o700)。
- 本地状态保存在
~/.mcpm/中,包括servers.json(已安装服务注册表)、aliases.json、secrets.enc.json(加密凭据存储)以及 guard 文件(pins.json、guard-policy.yaml、guard-confine.yaml、guard-unguarded.json、guard-events.jsonl)。没有注册表缓存:每次读取注册表都会实时获取数据。
不收集遥测数据。不做分析。无需账户。
贡献
欢迎贡献。
git clone https://github.com/getmcpm/cli.git
cd cli
pnpm install
pnpm test
pnpm build
提交 PR 前:
- 运行
pnpm test,确保所有测试通过 - 运行
pnpm lint检查类型 - 保持提交聚焦——每次提交只做一项更改
- 遵循 conventional commit 格式
本项目采用 MIT 许可证。请参阅 LICENSE。
安全
如果发现安全漏洞,请使用 GitHub 的私密漏洞报告功能,而不是公开提交问题。我们会在 48 小时内回复。
对于信任评估问题(扫描器误报或漏报),可以提交常规 GitHub 问题。
许可证
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。