MCP Safety Warden 是一个代理服务器,可包装任意 MCP 服务器,并为其工具添加行为分析、安全扫描、风险门控和安全执行功能。
[!IMPORTANT] MCP 安全是一个活跃的研究领域。近期的综述梳理了大量协议特定的威胁类别,涵盖工具投毒、提示注入、拉地毯攻击、供应链入侵、凭据窃取以及贯穿整个服务器生命周期的组合攻击。参见 Securing the MCP (OpenReview)、Landscape & Threats (arXiv)、When MCP Servers Attack (arXiv) 和 MCP-38 Taxonomy (arXiv)。
可作为代理使用,为任意 MCP 服务器添加安全门控;或将其指向你不拥有的服务器,在不进行任何工具调用的情况下运行完整的安全审计。
图 1. 两种运行模式:代理与审计
行为分析:效果类别、重试安全性、破坏性。由 LLM 辅助(Anthropic、OpenAI、Gemini、Ollama),并带有基于规则的回退。观测统计(延迟 p50/p95、失败率、输出大小)在每次代理调用后更新。
安全扫描:mcpsafety+ 五阶段流水线(Recon、Planner、Hacker、Auditor、Supervisor)。Cisco AI Defense(AST/YARA)。Snyk(元数据分析)。Kali 和 Burp Suite 集成以真实网络数据和 HTTP 层探测丰富流水线。从 GitHub 进行源代码扫描,包含熵、AST、污点流和拉地毯检测。
图 2. mcpsafety+ 五阶段流水线,在对任意 MCP 服务器运行完整安全审计时触发
安全执行:参数扫描(20+ 攻击类别,LLM 二次检查)。双层输出注入扫描。带替代方案和按工具策略的风险门控。每次调用时进行漂移检测,并支持独立检查。
图 3. 安全执行流水线:每次代理工具调用都要通过的五项检查
CLI:24 个子命令,交互式风险菜单,每个命令都支持 --json 标志,--yes 用于 CI。
检测内容
没有密钥时,包装器仅在基于规则的模式下运行:工具分类置信度较低、仅使用正则表达式进行注入扫描、风险门控中没有替代方案、没有 mcpsafety+ 流水线。对于完全本地化的设置,请运行 Ollama,设置 OLLAMA_MODEL,并显式传入 --provider ollama(Ollama 不会被自动检测)。
[!NOTE] 需要本地设置的 stdio 服务器(启动前需要本地配置的
stdio服务器——缺少配置文件、凭据、数据目录或操作系统特定依赖)无法被包装器检查——工具发现将失败,且会存储 0 个工具。你仍然可以通过向scan/onboard传入--github-url,或向security_scan_server传入github_url参数,在不启动服务器的情况下运行完整的源代码安全扫描。mcpsafety+ 流水线将直接从 GitHub 获取并分析源代码。sse和streamable_http服务器不受影响。
pip install mcpsafetywarden
安装所有可选附加项:
pip install "mcpsafetywarden[all]"
或安装特定附加项:
pip install "mcpsafetywarden[anthropic,snyk]"
从源代码安装:
git clone https://github.com/gautamvarmadatla/mcpsafetywarden
cd mcpsafetywarden
pip install .
SQLite 数据库在首次运行时自动创建于平台用户数据目录(Linux 上为 ~/.local/share/mcpsafetywarden/,macOS 上为 ~/Library/Application Support/mcpsafetywarden/,Windows 上为 %APPDATA%\mcpsafetywarden\)。可通过 MCP_DB_PATH 覆盖。
凭据保护(自动,无需操作)
传递给 register_server 或 onboard_server 的密钥值(Bearer 令牌、headers 或 env 中的 API 密钥)会被自动检测,并在任何内容触及模型上下文之前替换为不透明的 cref_ 标识符。真实凭据以加密形式存储在数据库中,并在连接时静默解析。模型、对话历史和日志只会看到 cref_<id>。
可选:存储凭据的静态加密
pip install cryptography
python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
在启动服务器之前,将打印出的密钥设置为 MCP_DB_ENCRYPTION_KEY。这会加密静态存储的服务器凭据和 cref_ 值。
所有配置均通过环境变量进行。
| 变量 | 默认值 | 用途 |
|---|---|---|
MCP_TRANSPORT | stdio | 传输模式:stdio、sse 或 streamable_http |
MCP_HOST | 127.0.0.1 | HTTP 传输的绑定地址 |
MCP_PORT | 8000 | HTTP 传输的绑定端口 |
MCP_AUTH_TOKEN | (未设置) | HTTP 传输认证的 Bearer 令牌 |
MCP_DB_ENCRYPTION_KEY | (未设置) | 用于静态加密存储凭据的 Fernet 密钥 |
ANTHROPIC_API_KEY | (未设置) | 启用 Anthropic 作为 LLM 提供商 |
OPENAI_API_KEY | (未设置) | 启用 OpenAI 作为 LLM 提供商 |
GEMINI_API_KEY 或 GOOGLE_API_KEY | (未设置) | 启用 Gemini 作为 LLM 提供商(优先使用 GEMINI_API_KEY) |
OLLAMA_MODEL | (未设置) | Ollama 的模型名称(例如 llama3.1) |
OLLAMA_BASE_URL | http://localhost:11434/v1 | Ollama API 基础 URL |
SNYK_TOKEN | (未设置) | 启用 Snyk E001 提示注入检测 |
MCP_SCANNER_API_KEY | (未设置) | Cisco AI Defense 云 ML 引擎密钥 |
MCP_SCANNER_LLM_API_KEY | (未设置) | 用于 Cisco 内部 AST 分析的 LLM 密钥 |
MCP_DB_PATH | (未设置) | 覆盖 SQLite 数据库文件路径 |
MCP_GRAPH_POLICY | warn | safe_tool_call 中的图强制执行:off(禁用)、warn(将风险上下文附加到响应)、block(硬阻止关键/高爆炸半径工具,除非 approved=True) |
GITHUB_TOKEN | (未设置) | 用于源代码扫描的 GitHub 个人访问令牌(将速率限制从 60 提升至 5,000 请求/小时) |
安全提示: 切勿提交 API 密钥或加密密钥。包装器在启动 stdio 服务器之前会从子进程环境中剥离自身的密钥。
将包装器添加到 claude_desktop_config.json: