MCP服务器安全扫描工具

MCPShield是一款针对MCP(Model Context Protocol)服务器的安全扫描工具,用于检测供应链风险、权限越界和配置错误,防止系统遭受威胁。

  • by ferrierepete
  • TypeScript
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 ferrierepete/mcpshield

使用说明

🔒 MCPShield

MCP(模型上下文协议)服务器的安全扫描程序。 在供应链风险、权限过度和配置错误危及您的系统之前,检测它们。

目录

为什么?

MCP(模型上下文协议)是Claude Desktop、VS Code和Cursor等AI工具连接到外部服务的标准方式。您安装的每个MCP服务器都可以 执行任意代码 在你的机器上。

最近的攻击包括:

  • 大规模分叉和重新发布 恶意负载的MCP服务器(荷兰,2026年3月)
  • 打字报价 --模仿官方的包裹 @modelcontextprotocol 服务器
  • 地毯拉 --更新合法软件包以包含恶意代码
  • 数据渗漏 --服务器秘密地将您的数据发送到外部端点

MCPShield扫描您的MCP配置 并在这些风险成为事件之前对其进行标记。

先决条件

MCPShield运行 Node.js,JavaScript运行时。你需要把它安装在你的机器上。

看看你有没有。 打开终端并运行:

node --version

如果你看到一个版本号(如 v20.11.0)你准备好了。如果你收到“找不到命令”,请安装Node.js:

  1. 首选 nodejs.org
  2. 下载 长期支持 (长期支持)版本
  3. 运行安装程序

如何打开终端:

  • macOS: 按 Cmd + Space,键入“终端”,按Enter键
  • 窗户: 按 Win + R,键入“powershell”,按Enter键
  • Linux: 按 Ctrl + Alt + T (因分布而异)

MCPShield需要Node.js 18或更高版本。

快速开始

安全扫描的三个步骤。

步骤1:安装(一次性设置)

npm install -g @ferrierepete/mcpshield

这增加了 mcpshield 命令到您的系统。

步骤2:运行扫描

mcpshield scan

MCPShield会自动发现您的所有MCP配置(Claude Desktop、VS Code、Cursor、Windsurf、Continue、Zed等),并一起扫描它们。不需要额外的旗帜。

使用 mcpshield list 查看发现了哪些配置文件。

第三步:阅读你的分数

MCPShield输出0到100的安全评分:

分数 这意味着什么
80–100 ✅ 好身材。无需采取紧急行动。
60–79 ⚠️ 有意义的风险。跑 mcpshield fix --dry-run 查看建议的修复程序。
0–59 🔴 关键风险。跑 mcpshield fix --dry-run 立即,然后 mcpshield fix 申请。

没有安装选项。 如果你不想安装任何东西,你可以用以下命令运行一次性扫描 npx:

npx @ferrierepete/mcpshield scan

无需全局安装,只需一步即可下载并运行MCPShield。

它检测到什么

一览

类别 用简单的英语来说,这意味着什么
供应链 确保您安装的MCP服务器是真实的,而不是伪造的副本
权限 标记有权访问不需要的文件或文件夹的服务器
秘密 如果密码或API密钥以明文形式存储在您的配置中,则发出警告
配置 捕获服务器设置中的错误或危险设置
网络 检测连接到可疑或不安全网址的服务器
码头工人 检查不安全的Docker容器设置(如果您使用Docker)

详细检测参考

类别 检查
供应链 未封装版本(semver范围被拒绝: ^, ~, >=)、未经验证的包、已知有风险的包、typosquats、npm exec/pnpm-dlx/yarn dlx/bun x runners、Python版本固定
注册表 npm/PyPI上的包存在、最近发布的包(<30天)、单版本包、缺少源代码仓库、单一维护者、PyPI深度分析(年龄、版本计数、没有源代码仓库的作者) (与 --registry)
权限 广泛的文件系统访问、敏感的工作目录、过于宽松的运行时标志(--allow-all, --no-sandbox, --disable-sandbox, --unsafe)args中的sudo/chmod/chown、扩展的危险路径(/tmp、/proc、/sys、/dev)、路径遍历尝试、IPv6 ::: 绑定、空/通配符环境变量、自动批准的工具与广泛访问相结合
秘密 硬编码API密钥,明文配置中的令牌,29个敏感的env-var模式,AWS/GitHub/Sstripe/Slack密钥格式检测
配置 缺少命令、本地可执行路径(/ 或 ~ 前缀),curl/wget作为服务器命令,通过7个解释器(bash、sh、zsh、dash、ksh、csh、tcsh)进行shell注入,跨6个运行时的代码执行标志(node/python/python3/perl/ruby/php),eval/exec模式,换行注入, $VAR 扩展、输入/附加重定向, /usr/bin/env 包装, node --require 预加载,VS代码 ${input:...} 变量替换
网络 绑定到0.0.0.0、可疑URL(24种模式,包括webhook.site、pastebin、Discord webhooks、Telegram机器人、URL缩短器、Google Forms)、基于IP的服务器URL、URL中的凭据
码头工人 --privileged 标志,23个危险的Docker标志(--security-opt, --user root, --cap-add, --net=host, --pid=host等),拆分形式 --cap-add 能力值, --mount 语法、敏感卷挂载、Docker套接字暴露、未固定映像标签、暴露端口、Docker Compose检测
HTTP/SSE传输 不安全的HTTP连接, ws:// 检测、远程服务器上缺少身份验证标头、URL凭据、传输类型/URL一致性验证
威胁 排版(14种图案,包括 @anthropic/, @openai/ 作用域扩展旁路)、反向shell检测、十六进制编码字符串、短base64(混淆)、URL中的凭据、URL编码的有效载荷、命令字段中的可疑URL
工具中毒 自动批准的工具、未经身份验证的远程服务器、运行时工具中毒通知 (信息严重性)
客户特定 VS代码 type/inputs 克劳德·菲尔德 autoApprove/alwaysAllowZed settings,继续仅使用URL的服务器

了解结果

安全评分

MCPShield生成0-100的安全评分。每个发现都会根据严重程度扣除分数:

  • 关键:-25分
  • 最高:-15分
  • 中等:-8分
  • 低:-3分
  • 信息:0分

禁用(休眠)服务器不在得分范围内。

如何处理你的分数:

范围 动作
80–100 ✅ 无需采取紧急行动。在方便的时候审查信息级别的调查结果。
60–79 ⚠️ 跑 mcpshield fix --dry-run 要预览建议的修复,请使用 mcpshield fix.
0–59 🔴 跑 mcpshield fix --dry-run 立即查看问题所在,然后应用修复程序 mcpshield fix。之后重新扫描以确认改进。

输出示例

🔒 MCPShield Security Report
──────────────────────────────────────────────────
Config: /home/user/.config/claude/config.json
Date:  2026-04-02 22:15:00

Security Score: 42/100

Findings: 2 critical  3 high  1 medium

📦 filesystem-dangerous [25/100]
   Command: npx

   🔴 Broad Filesystem Access [MCPS-001]
    Server has access to path "/". This grants read/write access to sensitive system directories.
    → Fix: Restrict filesystem access to only the specific directories this server needs.
    Refs: MCP03:2025 - Privilege Escalation via Scope Creep, MCP07:2025 - Insufficient Authentication & Authorization

   🟠 Sensitive Credentials in Config [MCPS-002]
    Found 1 sensitive environment variable(s): AWS_SECRET_ACCESS_KEY
    → Fix: Use a secrets manager instead of hardcoding credentials.

📦 [Dormant] old-server [N/A]
   Command: npx
   ℹ️ Server is disabled and excluded from the security score.

📦 github-safe [100/100]
   ✅ No security issues found

下一步做什么

扫描后,请按照以下顺序操作:

  1. 从关键发现开始 (🔴). 这些都是需要立即关注的真实风险。
  2. 预览自动修复 在应用它们之前:
    mcpshield fix --dry-run
    
    这准确地显示了会发生什么变化,而无需触摸您的文件。
  3. 应用修复程序 当您对预览满意时:
    mcpshield fix
    
    MCPShield创建了一个 .bak 在进行任何更改之前进行备份,这样您就可以随时撤消。
  4. 重新扫描 查看您的更新分数:
    mcpshield scan
    

自动修正

MCPShield可以自动修复MCP配置中的几个常见安全问题。它总是创造一个 .bak 在进行更改之前进行备份,这样如果出现问题,您就可以恢复原始状态。

安全第一的方法。 始终从模拟运行开始预览更改:

mcpshield fix --dry-run

当您准备申请时:

mcpshield fix

要定位特定的配置文件,请执行以下操作:

mcpshield fix --config ~/.config/Claude/claude_desktop_config.json

注: 不像 scan (自动发现所有配置), fix 和 watch 仅自动检测他们找到的第一个配置文件。如果您使用多个MCP客户端(Claude Desktop、VS Code、Cursor等),请使用以下命令指定配置 --config.

支持的自动修复程序:

修复 它的作用
Pin包版本 从npm注册表解析确切的版本(例如。 pkg@1.2.3);倒退到 pkg@0.0.0-REVIEW-NEEDED 如果决议失败
替换硬编码的秘密 将明文值替换为 ${VAR_NAME} 参考文献
绑定到本地主机 替换 0.0.0.0 随着 127.0.0.1 和 :: 随着 ::1 (IPV 6本地主机)
升级到HTTPS 替换 http:// 随着 https:// 用于远程URL
删除空的环境变量 清理空或通配符环境变量
标志 描述
-c, --config <path> MCP配置文件的路径
--dry-run 预览修复而不写入更改

人工智能扫描(可选)

MCPShield可以使用AI模型来仔细检查其发现并减少误报。这是完全可选的,没有它,MCPShield也能很好地工作。

它是如何工作的。 当您启用AI扫描时,MCPShield会发送 描述 将每个发现(不是你的秘密值)提交给人工智能模型以获得第二意见。人工智能将返回三个判决之一:

  • 确认 --这是一个真正的安全风险,请注意
  • 可能为假阳性 --在这种情况下可能是安全的,但值得一看
  • 需要审核 --人工智能无法判断,因此人类应该进行验证

没有AI密钥?没问题 MCPShield内置信心评分,无需任何API键即可运行。它使用上下文规则来向上或向下调整置信度(例如,被取消固定的可信包的置信度低于未知包)。使用 --min-confidence 0.7 过滤掉低置信度的发现。

要启用AI扫描:

mcpshield scan --ai --ai-provider openai

支持的提供商:

提供程序 标志 环境变量 默认模型
开放人工智能 --ai-provider openai OPENAI_API_KEY 或 MCPSHIELD_OPENAI_API_KEY gpt-4o-mini
人类 --ai-provider anthropic ANTHROPIC_API_KEY 或 MCPSHIELD_ANTHROPIC_API_KEY claude-sonnet-4-20250514
谷歌双子座 --ai-provider gemini GEMINI_API_KEY, GOOGLE_API_KEY,或 MCPSHIELD_GEMINI_API_KEY gemini-2.0-flash
OpenAI兼容 --ai-provider openai --ai-base-url <url> 与OpenAI相同

适用于 Groq、人工智能、Ollama,以及任何与OpenAI兼容的端点,通过 --ai-base-url.

其他环境变量:

  • MCPSHIELD_AI_MODEL --覆盖任何提供程序的默认模型
  • MCPSHIELD_AI_BASE_URL --设置自定义OpenAI兼容端点
  • MCPSHIELD_AI_PROVIDER --设置默认提供程序,不使用 --ai-provider 旗帜

安全说明: MCPShield从不将你的秘密发送给AI。只有env var 钥匙 (不是值)包含在提示中。AI响应的上限为1 MB,以防止内存耗尽。

配置

.mcpshieldrc

您可以创建一个配置文件来设置默认选项,这样您就不必每次都传递标志。MCPShield寻找 .mcpshieldrc, .mcpshieldrc.json,或 .mcpshield.json.

把它放在哪里。 MCPShield首先搜索当前目录,然后搜索您的主目录。您的主目录是:

  • macOS/Linux: ~ (例如。 /Users/yourname/)
  • 窗户: %USERPROFILE% (例如。 C:\Users\yourname\)

如何创建它。 创建一个名为的新文本文件 .mcpshieldrc 在您的主目录中包含以下内容:

{
  "severityThreshold": "medium",
  "ignore": ["MCPS-001"],
  "format": "pretty",
  "registry": false,
  "trustedPackages": ["@myorg/custom-mcp-server"],
  "riskyPackages": ["some-known-bad-package"],
  "ai": true,
  "aiProvider": "openai",
  "aiModel": "gpt-4o-mini",
  "aiBaseUrl": "https://api.openai.com/v1",
  "minConfidence": 0.6
}

选项参考:

字段 类型 描述
severityThreshold string 要显示的最小严重性: critical, high, medium, low, info
ignore string[] 查找要忽略的ID或标题(子字符串匹配)
format string 默认输出格式: pretty, json, markdown, sarif
registry boolean 默认情况下启用npm/PyPI注册表检查
trustedPackages string[] 要视为受信任的其他包
riskyPackages string[] 其他要视为有风险的包
ai boolean 启用基于AI的误报减少
aiProvider string AI提供者: openai, anthropic, gemini
aiModel string 覆盖默认AI模型
aiBaseUrl string OpenAI兼容提供者的自定义基本URL
minConfidence number 显示结果的最小置信阈值(0.0–1.0)

MCPShield警告潜在危险 .mcpshieldrc 选项:

  • 过宽 ignore 可能抑制关键发现的规则
  • 包裹在 trustedPackages 与已知的组织模式不匹配(例如。 @modelcontextprotocol/)
  • minConfidence 设置为0.8以上(有效地掩盖了大多数发现)

自定义软件包列表

受信任和有风险的包列表以JSON文件存储在 src/data/:

  • trusted-packages.json --已验证为合法的包(13个包,1个受信任范围)
  • risky-packages.json --已知恶意或可疑的包(8个包)
  • suspicious-patterns.json --URL模式(24)和拼写错误规则(14)

从以下位置覆盖这些列表 .mcpshieldrc 使用 trustedPackages 和 riskyPackages.

配置位置

MCPShield自动发现所有主要MCP客户端的配置:

客户端 作用域 路径
克劳德桌面版 macOS ~/Library/Application Support/Claude/claude_desktop_config.json
克劳德桌面版 Linux ~/.config/Claude/claude_desktop_config.json
克劳德桌面版 窗户 %APPDATA%\Claude\claude_desktop_config.json
克劳德代码 用户/本地 ~/.claude.json
克劳德代码 项目 .mcp.json
克劳德代码 本地 .claude/settings.local.json
VS Code 工作区 .vscode/mcp.json
光标 全球 ~/.cursor/mcp.json
光标 项目 .cursor/mcp.json
帆板运动 全球 ~/.codeium/windsurf/mcp_config.json
继续 全球 ~/.continue/config.json
泽德 全球 ~/.config/zed/settings.json
自定义 — MCP_CONFIG_PATH 环境变量

MCPShield自动处理不同的配置格式-- mcpServers (对象), servers (VS码), context_servers (Zed)和基于阵列的 mcpServers (继续)。

注: 当时 MCP_CONFIG_PATH 如果设置了环境变量,MCPShield将使用该路径并完全跳过自动发现,即使对于 scan.

OWASP MCP前10名

开放式Web应用程序安全项目 (全球开放应用安全项目)是一个发布安全标准的非营利组织。OWASP MCP Top 10是他们针对MCP服务器配置中最关键安全风险的框架。

MCPShield将调查结果映射到 OWASP MCP前10名 框架:

ID 类别
MCP01:2025 代币管理不善和秘密暴露
MCP02:2025 工具中毒
MCP03:2025 通过范围爬行进行权限升级
MCP04:2025 软件供应链攻击和依赖篡改
MCP05:2025 命令注入和执行
MCP06:2025 意图流颠覆
MCP07:2025 身份验证和授权不足
MCP08:2025 缺乏审计和遥测
MCP09:2025 影子MCP服务器
MCP10:2025 上下文注入和过度共享

对于开发者

以下部分介绍高级使用、集成和编程API。如果您将MCPShield用作CLI工具,则以上所有内容都已涵盖。

高级命令

mcpshield scan

扫描MCP服务器配置以查找安全问题。

标志 描述
-c, --config <path> MCP配置文件的路径
-f, --format <fmt> 输出格式: pretty, json, markdown, sarif
-r, --registry 启用远程npm/PyPI注册表检查
-s, --severity <level> 最低严重程度: critical, high, medium, low, info
-i, --ignore <ids...> 查找要忽略的ID或标题(子字符串匹配-- --ignore typo 匹配“潜在的百草枯”)
-q, --quiet 单行摘要输出(非常适合CI脚本)
--min-confidence <n> 显示结果的最小置信阈值(0.0–1.0)
--ai 启用基于AI的假阳性减少(需要API密钥)
--ai-provider <name> 人工智能提供商: openai, anthropic, gemini
--ai-model <model> 覆盖默认AI模型
--ai-base-url <url> OpenAI兼容端点的自定义基本URL
--no-spinner 禁用进度微调器
# Auto-detect and scan your MCP config
mcpshield scan

# Scan a specific config file
mcpshield scan --config ~/.config/claude/config.json

# Output as JSON (for CI/CD)
mcpshield scan --format json

# Output as Markdown
mcpshield scan --format markdown

# Output as SARIF (for GitHub Security tab)
mcpshield scan --format sarif

# Enable remote registry checks (npm/PyPI)
mcpshield scan --registry

# Filter by severity
mcpshield scan -s high

# Ignore findings by ID or title (partial matching supported)
mcpshield scan --ignore MCPS-001 Typosquat

# Quiet mode (CI-friendly one-liner output)
mcpshield scan --quiet

# Filter out low-confidence findings (heuristic, no API key needed)
# Warns if all findings are filtered to zero
mcpshield scan --min-confidence 0.7

# AI-powered false positive reduction (BYOK — bring your own key)
mcpshield scan --ai --ai-provider openai
mcpshield scan --ai --ai-provider anthropic
mcpshield scan --ai --ai-provider gemini

# Use a custom OpenAI-compatible endpoint (Groq, Together, Ollama, etc.)
mcpshield scan --ai --ai-provider openai --ai-base-url http://localhost:11434/v1

多配置发现: mcpshield scan 默认情况下,自动发现并扫描所有已安装客户端(Claude Desktop、VS Code、Cursor、Windsurf、Continue、Zed等)的所有MCP配置。不 --config 旗帜需要。使用 mcpshield list 查看发现了哪些配置文件。

mcpshield watch

查看您的MCP配置文件,并在每次更改时自动重新扫描。

标志 描述
-c, --config <path> MCP配置文件的路径
-f, --format <fmt> 输出格式: pretty, json, markdown, sarif

注: watch 自动只检测第一个配置文件。使用 --config 瞄准一个特定的目标。

mcpshield list

列出系统上发现的所有MCP配置文件。

mcpshield owasp

显示OWASP MCP Top 10安全框架参考。

CI/CD集成

# GitHub Actions — JSON output
- name: MCP Security Scan
  run: npx @ferrierepete/mcpshield scan --format json
  # Exits with code 2 for critical, 1 for high findings

# GitHub Actions — SARIF for Security tab
- name: MCP Security Scan (SARIF)
  run: npx @ferrierepete/mcpshield scan --format sarif > results.sarif

- name: Upload SARIF
  uses: github/codeql-action/upload-sarif@v3
  with:
    sarif_file: results.sarif

退出代码: 0 =干净, 1 =高发现, 2 =关键发现。用途 process.exitCode 而不是 process.exit() 以避免截断管道输出。

插件系统

通过插件API使用自定义扫描仪扩展MCPShield:

import { pluginRegistry, definePlugin, createFinding } from '@ferrierepete/mcpshield';

pluginRegistry.register(definePlugin({
  name: 'my-org-policy',
  description: 'Enforce internal security policies',
  scan: (serverName, config) => {
    const findings = [];
    // Your custom checks here
    if (!config.env?.AUDIT_LOG) {
      findings.push(createFinding({
        title: 'Missing Audit Log',
        description: 'Internal policy requires AUDIT_LOG env var.',
        severity: 'medium',
        category: 'configuration',
        serverName,
        remediation: 'Add AUDIT_LOG=true to the server environment.',
      }));
    }
    return findings;
  },
}));

插件支持同步和异步扫描程序,插件中的错误是隔离的。崩溃的插件不会影响扫描的其余部分。

程序化API

MCPShield可以用作您自己的Node.js工具中的库:

import {
  scanAllServers,
  scanAllServersWithRegistry,
  scanServer,
  loadConfig,
  autoDetectConfig,
  discoverConfigs,
} from '@ferrierepete/mcpshield';

// Load a config file
const config = loadConfig('/path/to/mcp.json');

// Run a local scan
const result = scanAllServers(config.mcpServers, '/path/to/mcp.json');
console.log(`Score: ${result.summary.score}/100`);
console.log(`Critical: ${result.summary.critical}`);

// Run with remote registry verification
const fullResult = await scanAllServersWithRegistry(config.mcpServers, '/path/to/mcp.json');

// Scan a single server
const serverResult = scanServer('my-server', config.mcpServers['my-server']);

// Access per-server findings
for (const server of fullResult.servers) {
  console.log(`${server.name}: ${server.findings.length} findings`);
  for (const finding of server.findings) {
    console.log(`  [${finding.severity}] ${finding.title}`);
    console.log(`  Fix: ${finding.remediation}`);
  }
}

// Discover config file paths
const paths = discoverConfigs();

关键导出类型

import type {
  ScanResult,       // Top-level result from scanAllServers
  ServerScanResult, // Per-server findings and score
  Finding,          // Individual security finding
  Severity,         // 'critical' | 'high' | 'medium' | 'low' | 'info'
  FindingCategory,  // 'supply-chain' | 'permissions' | 'configuration' | 'authentication' | 'network' | 'data-exposure'
  MCPConfig,        // Parsed MCP config file shape
  MCPServerConfig,  // Individual server config
  AIConfig,         // AI provider configuration
  AIVerdict,        // 'confirmed' | 'likely-false-positive' | 'needs-review'
  AIProviderType,   // 'openai' | 'anthropic' | 'gemini'
  Plugin,           // Plugin definition (name, description, scan function)
  PluginScanner,    // Plugin scanner function type
} from '@ferrierepete/mcpshield';

技术安全强化

MCPShield包括几种内置保护措施,以防止误用:

  • 路径遍历预防 --所有配置路径(是否来自 --config, MCP_CONFIG_PATH,或自动检测)通过以下方式验证 resolveSafeConfigPath()。只允许使用当前工作目录或主目录中的路径。尝试加载以下文件 /etc/passwd 或 /proc/self/environ 以明显的错误被拒绝
  • 多配置扫描 --默认情况下,扫描所有发现的MCP配置,而不仅仅是第一个发现的配置。将每个客户端配置中的服务器合并并扫描在一起
  • 休眠服务器标记 --禁用的服务器将获得 [Dormant] 在调查结果上加前缀,并从总体安全评分中排除
  • 写入前配置备份 --the fix 命令创建 .bak 在应用任何更改之前备份配置文件
  • 密钥清理 --the fix 命令清除包含shell元字符的env-var键名(例如。 $(cmd), `cmd`, ;rm -rf)删除危险密钥并将其替换为安全的字母数字名称
  • 精确版本固定 --autofix从npm注册表(异步)解析确切的版本,而不是使用 @latest;倒退到 @0.0.0-REVIEW-NEEDED 如果无法访问注册表
  • 具有有效URL的SARIF --所有SARIF输出包括有效 helpUri 每个发现的链接和OWASP MCP前10名参考
  • AI响应大小限制 --AI提供者的响应上限为1 MB,以防止无限响应导致内存耗尽
  • 注册表失败关闭 --当npm/PyPI注册表检查失败(网络错误、HTTP 500、速率限制)时,包将被视为未验证,而不是静默传递
  • 从未发送给AI的秘密值 --只有环境变量 钥匙 (非值)包含在AI评估提示中

许可证

麻省 理工© 彼得 费里埃