浏览 MCP与Skills教程与资源

MCP 安装前怎么审查:用 Filesystem 包核对来源、版本和权限

拿到一条 npx 命令后,先拆清下载什么、执行什么、访问哪里。本文用具体 Filesystem 项目演示取证方法,也说明完整性、固定版本和目录参数各自不能证明什么。

审查对象

把一条安装命令拆成可以核对的事实

审查对象是 modelcontextprotocol/servers 仓库中的 Filesystem Server,对应 npm 包 @modelcontextprotocol/server-filesystem。它是文件系统操作实现,包含读取、修改、移动等工具。下面的命令只是分析对象,本节不要求执行;指定 demo 目录也不把软件变成只读程序。

待审查命令

先解释每个参数,再决定是否运行

npx -y @modelcontextprotocol/server-filesystem /absolute/path/mcp-demo

npx 可能下载并执行包;-y 自动同意下载提示;省略版本通常跟随发布标签;最后一个参数由这个具体 Server 解释为允许目录,不是操作系统沙盒。

先读元数据

从官方仓库反查包,再固定本次审查版本

从仓库 README 的发布链接进入 npm,不从搜索广告或相似包名进入。以下 PowerShell 命令只查询 registry 元数据:它们不启动 Server。把输出作为本次检查材料保存;version 是查询时解析到的版本,后面的查询固定使用同一个值。网络失败时停在这里,不把空版本继续传下去。

PowerShell

读取本次包版本、入口和发布信息

$mcpPackage = '@modelcontextprotocol/server-filesystem'
$mcpVersionOutput = npm view $mcpPackage version
if ($LASTEXITCODE -ne 0 -or -not $mcpVersionOutput) { throw '无法读取包版本' }
$mcpVersion = ([string]$mcpVersionOutput).Trim()
$mcpSpec = "$mcpPackage@$mcpVersion"
npm view $mcpSpec name version repository.url bin scripts dependencies dist.integrity dist.tarball --json

仓库 main 分支不是 npm 发布工件:两者版本、构建结果或依赖范围可能不同。repository 字段也可以由发布者填写,所以还需从官方仓库向包的链接反向印证。

审查工件

下载包用于阅读,不执行安装生命周期

如果元数据与仓库身份相符,可在新的审查目录下载同一版本 tarball。下面使用上一段的 $mcpSpec;--ignore-scripts 禁止这次 npm pack 的脚本执行。它不启动 Server,也不证明包无恶意。返回记录会给出文件名和摘要;审查完成前不要把 tarball 加入客户端。

PowerShell

新建独立取证目录并保存包

$reviewDir = Join-Path $env:TEMP ('mcp-package-review-' + [guid]::NewGuid().ToString('N'))
New-Item -ItemType Directory -Path $reviewDir | Out-Null
Push-Location $reviewDir
try {
  npm pack $mcpSpec --ignore-scripts --json
  if ($LASTEXITCODE -ne 0) { throw '下载失败,停止审查' }
} finally {
  Pop-Location
}

用归档查看器检查 package/package.json 和它声明的 bin 入口,追踪是否有额外下载、网络请求、子进程或超出任务所需的文件访问。顶层包固定版本不代表它的所有传递依赖固定;正式部署还应使用锁文件并检查依赖变动。

证据怎样改变决定

完整性、发布身份和行为审查不能互相替代

观察到的证据能够支持仍然不能支持
官方仓库 README 指向同名 npm 包项目与包的关联有一手依据。发布账号从未被盗、未来版本行为不变。
版本号和 dist.integrity 已记录能识别本次审查的发布工件,下载摘要可比对。工件本身无害;恶意代码也可以有正确摘要。
来源证明或签名可验证在其信任模型内绑定构建/发布来源或完整性。代码已被全面审计;缺少签名也不自动证明被替换。
目录参数只指定了 mcp-demo这个实现把它用于应用层目录限制。进程受操作系统强制隔离、网络被阻断,或文件只能读取。
工具标注 readOnlyHint给宿主提供行为提示。权限强制执行或完全没有副作用;不可信服务可以标错。
这个项目的特殊点

允许目录可能被 Roots 更新,不能只截图启动参数

当前 Filesystem README 说明:支持 Roots 的客户端可以提供目录,并用返回的 Roots 替换启动参数中的允许目录;初始化后也可能更新。因此要检查当前 list_allowed_directories 的结果,再选择测试路径。‘命令里只写了一个目录’并非会话实际范围的充分证据。

只允许读一个样本文件时,至少要分别处理三层:客户端是否只开放需要的读工具;Server 当前允许目录是否准确;进程和所持凭证是否被系统权限或容器挂载进一步约束。仅在提示词里写‘不准写’只约束模型意图,不能替代后两层。

本地 Server 读到的内容还可能回到模型上下文,宿主是否会把上下文送到远程模型由产品部署决定。把服务跑在本机,不足以得出‘文件内容永不离机’的结论。

作出安装决定

同一个包,可以接受练习而暂不接受生产使用

可以进入无敏感样本测试

已确认仓库与包对应;固定版本和依赖记录可留存;启动入口能解释;当前目录可核对;只需要列举和读取专门创建的样本。第一次连接只验证这些具体能力,尚不作生产安全结论。

应先补控制,再接真实项目

任务只读但当前客户端会暴露写工具,或 Roots 自动扩到整个仓库。先找到真实的工具筛选/审批、目录配置或系统只读控制;缺少控制时不要用‘已提示只读’代替解决。

应停止安装并待核实

仓库指向的包和教程命令不一致,发布工件出现无法解释的下载执行入口,或者必须交出与任务无关的凭证。把未知事实和所需证据写下来;此时不安装本身就是有效结果,不必强行走完教程。

一手依据

资料与核对范围

资料核对日:2026-10-10。以下来源支持协议与配置说明;文中的命令、练习和预期结果不代表本站已在所有客户端和系统完成实测。