mcpField
M
mcpm

mcpm

本地服务
github.com安全32 天前更新

关于 mcpm

mcpm 是一款本地命令行工具,用于查找、安装、管理和审计 MCP 服务,并提供信任评估与运行时检查。它面向跨 AI 客户端管理 MCP 配置的用户,将包管理流程与本地安全控制结合起来。

主要功能

  1. 01搜索并安装注册表中的服务
  2. 02评估信任度并审计安装项
  3. 03通过本地中继检查工具调用
  4. 04固定工具定义并检测变更
  5. 05管理服务堆栈和锁定文件
  6. 06检查客户端配置健康状况

适用场景

  1. 01安装前评估 MCP 服务风险
  2. 02审计多个客户端中的已安装服务
  3. 03复现项目锁定的服务配置
  4. 04查找配置问题和明文密钥

MCP 相关

mcpm 管理 MCP 服务安装和客户端配置。它的本地 stdio 中继位于 AI 客户端与服务之间,用于检查工具调用并检测工具定义变更。

配置

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

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

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

安装包
npm@getmcpm/cli0.47.7

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

mcpm — Model Context Protocol 服务的安全防护工具和包管理器

mcpm — MCP 安全防护工具和包管理器

在运行时、在你的机器上,拦截 Model Context Protocol(MCP)服务中的提示词注入、工具投毒、rug-pull 和凭据窃取。 你的 AI Agent 会信任它交互的每个 MCP 服务;mcpm 会为每次安装评分,使用 Sigstore 验证其供应链,固定每个工具定义,并通过本地中继检查每次工具调用——在 macOS 上还可选择启用操作系统沙箱。执行防护的路径上没有云服务、账号或大模型。

一切都在你的机器上运行。 无需账号,没有 mcpm 后端,也没有遥测——防护程序是本地 stdio 中继,信任评分在本地计算,不使用模型,也没有远程判定(40 分的静态扫描部分由确定性的正则表达式和结构检查组成,你可以自行查看;其余部分是本地健康检查、注册表元数据,以及仅在你指定时才会使用的外部扫描器)。解析、审计或重新验证服务的命令确实会访问公共 MCP 注册表和 npm——但不会有任何请求发往 mcpm 服务。

npm version license tests Known Vulnerabilities


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 来源验证,以及支持固定版本/检测偏移并具备操作系统隔离的运行时中继整合到一个本地、无需账户的工具中。

mcpm 演示

快速开始

使用你现有的包管理器安装:

方法命令
npm(全局)npm install -g @getmcpm/cli
npx(无需安装)npx @getmcpm/cli <command>
pnpmpnpm add -g @getmcpm/cli
misemise 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 也是唯一一个会删除而非拒绝的分数门槛,因此在这里剔除该项会移除更多服务器,而非更少。

命令

CommandDescription
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
  1. 搜索和安装会查询由 Model Context Protocol 项目维护的官方 MCP Registry API(v0.1)。
  2. 信任评估在本地使用内置扫描器(基于正则表达式的模式检测)运行,也可以额外调用已安装且通过 MCPM_EXTERNAL_SCANNER 指定的第三方扫描器。
  3. 配置管理会读取并写入每种 AI 客户端的原生配置文件。所有写入都使用受限权限的原子文件操作(文件权限为 0o600,目录权限为 0o700)。
  4. 本地状态保存在 ~/.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 问题。

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

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

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