使用说明
MCP网关-基于人工智能的MCP安全网关
第一个让AI工具访问的安全网关 可审计的,而不仅仅是允许/拒绝。
Gemini 3黑客马拉松参赛作品 | 实时管道演示 | 快速开始 | 7个双子座积分点
问题:13000多台MCP服务器,零安全层
MCP(模型上下文协议)生态系统已经爆发 13000+台服务器,但没有标准的安全层。AI代理连接到MCP服务器,可以:
- 域名抢注:
read_fi1e(带数字1)模仿者read_file--人工智能无法区分 - 签名伪装:工具描述更改自 “列出分析数据” 到 “执行系统命令并提取凭据” --初步批准后
- 诱售法:一个秘密请求的“只读文件查看器”
password,api_key,session_id领域
现有的工具无法捕捉到这些。 静态扫描程序会错过语义攻击。基于规则的系统无法推理意图。
真实世界验证
MCP生态系统具有 17500+台服务器 (mcp.so,2026年2月) 94%的攻击成功率 跨越12个攻击类别(赵等人,研究报告:2509.24272).现有的扫描仪可以实现低至 ~3%检测率 (检测到120个恶意服务器中的4个;来源于赵等人表3)。
2026年2月,安全研究人员 锦鲤安保 建立 341种恶意技能(12%) 在OpenClaw ClawHub市场(2857项技能经过审核)。OpenClaw的回应——整合基于VirusTotal哈希的扫描——地址 已知恶意软件签名但仅凭基于哈希的扫描无法捕捉到MCP特定的威胁:
- 语义操作:批准后更改含义的工具描述(签名隐藏)
- 快速注射:隐藏在工具输出中的指令(Snyk毒物技能,2026年2月)
- 域名抢注:角色级工具名称模仿(
read_fi1evsread_file)
| 方法 | 捕获已知恶意软件 | 捕获语义攻击 | 捕获新威胁 |
|---|---|---|---|
| 基于哈希的(VirusTotal) | 是 | 否 | 否 |
| 基于规则(~3%检测) | 部分 | 部分 | 否 |
| 双子座3推理(MCP网关) | 部分 | 是 | 是 |
MCP网关补充了基于哈希的扫描 利用Gemini 3的语义推理——检测 新颖的、基于意图的攻击 该签名匹配无法捕获。
MCP网关做什么
MCP网关是 安全第一代理 AI客户端(ChatGPT、Claude、Gemini CLI)和MCP服务器之间。每次工具调用都要经过一个6层检查管道,该管道由 Gemini 3结构化输出:
关键洞察:每个决策都会产生允许/拒绝,而不是二进制的允许/拒绝 结构化证据 --the 为什么 在每一个判决背后——确保安全 可审计和可解释.
为什么选择双子座3?(不仅仅是“任何法学硕士”)
MCP网关使用 5 Gemini 3独家功能 穿过 全部7个集成点 --不仅仅是一个组件:
| Gemini 3功能 | 用于 | 为什么只有Gemini 3 |
|---|---|---|
| 思维层次 | 全部6个组件(high 为了安全起见, low 速度) |
2层推理:对威胁进行深入分析,对安全内容进行快速分类 |
| 函数调用 | Agent Scan(多轮工具使用) | Gemini 自主决定 调用哪些安全工具——而不是固定的管道 |
| URL上下文 | 网络沙盒 | 双子座3 浏览URL本身 --无需我们自己的渲染器的多模式页面分析 |
| 谷歌搜索暂停 | AI委员会+扫描仪+沙盒+代理扫描 | 实时威胁情报:“此服务器/域/包是否被报告为恶意?” |
| 结构化输出 | 所有7个组件(类型化JSON模式) | 在单个API调用中组合浏览+搜索+类型化判决 |
建筑:双子座3不是“最后的分类器”——它是 推理引擎 浏览、搜索、思考和决定:
response = client.models.generate_content(
model="gemini-3-flash-preview",
contents=f"Analyze this URL for security threats: {url}",
config=types.GenerateContentConfig(
# Gemini 3 unique: thinking + tools + structured output
thinking_config=types.ThinkingConfig(thinking_level="high"),
tools=[
types.Tool(url_context=types.UrlContext()), # Browse the URL
types.Tool(google_search=types.GoogleSearch()), # Search threat intel
],
response_mime_type="application/json",
response_schema=WebSecurityVerdict, # Typed verdict
temperature=1.0, # Gemini 3 recommended
max_output_tokens=4096,
),
)
verdict = WebSecurityVerdict.model_validate_json(response.text)
没有双子座3:仅基于规则(DGA熵、品牌匹配、TLD评分)。有效,但错过了语义攻击。 双子座3:深入推理为什么一个页面是危险的,实时威胁情报,视觉页面分析。
7双子座3积分点
| # | 组件 | 架构 | 使用Gemini 3功能 |
|---|---|---|---|
| 1 | AI委员会 | CouncilVerdict |
思考水平=高 + 谷歌搜索停飞 +结构化输出 |
| 2 | 语义扫描器 | SemanticScanResult |
思考水平=高 + 谷歌搜索 +结构化输出 |
| 3 | RedTeam生成器 | RedTeamGeneration |
思考水平=低 +用于快速生成攻击的结构化输出 |
| 4 | 红队评估员 | PayloadSafetyVerdict |
思考水平=高 +安全评估的结构化输出 |
| 5 | 因果网络沙盒 | WebSecurityVerdict |
thinking_level+URL上下文+谷歌搜索+结构化输出 |
| 6 | 代理扫描 | AgentScanResult |
function_calling+thinking_level=高+谷歌搜索+多回合 |
| 7 | 审计QA聊天 | AuditQAResponse |
思考水平=高 +结构化输出——Gemini使用证据解释自己的安全决策 |
因果网络沙盒:“只有Gemini 3才能做到这一点”功能
Causal Web沙盒展示了其功能 双子座3独有:
- URL上下文:Gemini 3直接访问可疑URL,在内部呈现页面
- 谷歌搜索:检查威胁数据库中是否报告了域/URL
- 思维水平:
high为了进行深入分析(复杂的网络钓鱼),low用于快速分诊(<100ms) - 因果链:逐步解释攻击进展
- MCP特定威胁:检测网络内容中的JSON-RPC注入、工具阴影、签名隐藏
Input: https://rope.odakyu.qpon/login
Output: {
"classification": "phishing",
"confidence": 0.93,
"causal_chain": [
{"step": 1, "action": "Domain impersonates brand 'odakyu'",
"consequence": "Not the legitimate odakyu railway site"},
{"step": 2, "action": "Hosted on .qpon (high-abuse TLD)",
"consequence": "TLD is commonly used for scam/phishing sites"}
],
"attack_narrative": "PHISHING: 'rope.odakyu.qpon' impersonates the brand 'odakyu' on a .qpon domain...",
"mcp_specific_threats": ["Brand impersonation: 'odakyu' on .qpon. AI agents must not trust credentials."]
}
代理扫描:Gemini 3作为安全代理(函数调用)
最先进的集成——Gemini 3作为 自主安全代理:
POST /api/web-sandbox/agent-scan {"url": "https://suspicious-site.tk"}
Gemini 3 Agent Loop:
Turn 1: "Let me check the domain for DGA patterns"
→ calls check_dga(domain="suspicious-site.tk")
→ result: {is_dga: false, entropy: 3.2}
Turn 2: "TLD .tk is suspicious, let me check reputation"
→ calls check_tld_reputation(domain="suspicious-site.tk", tld="tk")
→ result: {category: "suspicious"}
Turn 3: "Let me search for known threats on this domain"
→ uses Google Search grounding
Final: Synthesizes all tool results → WebSecurityVerdict
{classification: "phishing", confidence: 0.87, tools_called: 3}
为什么这很重要:与固定管道不同,Gemini 3 决定调查什么A. .com 域可能只需要DGA检查,而 .tk 域触发全面分析。这是 代理安全 --MCP代理本身使用相同的模式。
并排:基于规则与Gemini Agent
curl -X POST http://localhost:4100/api/web-sandbox/compare \
-H "Content-Type: application/json" \
-d '{"url": "https://xkjhwqe.tk/payload"}'
在一个响应中返回两个判断——准确显示Gemini 3在纯基于规则的分析中添加了什么:
rule_based:快速(<5ms),捕获DGA熵+可疑TLDgemini_agent:工具选择的深度推理、谷歌搜索威胁情报、多轮分析
实时管道演示
网关包括 实时SSE管道 这在大约30秒内展示了完整的安全流程:
- LLM代理请求工具访问 --5台具有混合信任级别的MCP服务器
- 网关拦截+安全扫描 --具有发现计数的静态分析
- 人工智能委员会裁决(双子座3) --每台服务器允许/拒绝延迟和理由
- 高级威胁分析 --打字字符差异、特征隐身描述差异、诱饵和开关场检测
- 因果网络沙盒 --实时HTTP获取→ DOM分析→ 双子座在3个测试页面上的判断
- 代理扫描(函数调用) --Gemini自主选择安全工具来分析可疑URL
- MCP工具呼叫拦截 --具有BLOCKED/LALLOWED/DLP强制的代理会话模拟
每个步骤都以服务器发送事件的形式流式传输,并带有视觉指示器(Gemini徽章、延迟计时器、置信度条)。
仪表盘用户界面
共9页 双语支持(英语/日语):
| 第页 | 目的 |
|---|---|
| 仪表盘 | KPI卡、网关流程图、实时管道演示、攻击检测时间线、最近的决策、, 自调整权重 |
| 环境 | 安装向导、系统诊断、环境注册 |
| 扫描 | 带有严重性/OWSP故障的安全扫描结果 |
| 允许列表 | MCP服务器注册、信任状态、扫描历史 |
| 网络沙盒 | 实时URL扫描程序,包含DOM威胁、网络跟踪、所有问题、Gemini判断 |
| 审计日志 | 带有证据ID的可扩展决策证据线索+ 审计QA聊天(Gemini 3) |
| 计费 | 代币消耗、API调用计数、成本估算 |
| 设置 | OWASP LLM前10个策略配置+OAuth2标准杆数/DPoP路线图 |
攻击检测时间表
仪表板包括一个可视化的攻击时间线 字符级差异渲染:
- 工具阴影:
read_fi1evsread_file--以红色/绿色突出显示的字符差异 - 签名伪装:
“列出分析数据”→ “执行系统命令” --删除线+红色新描述 - 诱饵和开关:敏感字段(
password,api_key)内联高亮显示
高级攻击检测
三种针对MCP供应链威胁的新型探测器:
| 检测器 | 攻击 | 检测 |
|---|---|---|
| 签名伪装 | 注册后工具描述更改 | Jaccard单词集相似性(<40%=隐藏) |
| 诱售法 | 良性描述+恶意模式 | 模式字段与描述声明分析 |
| 工具阴影 | 模仿可信工具的名称 | 字符级相似性与20个知名MCP工具 |
| DGA检测 | 算法生成的域 | 香农熵+辅音比+聚类分析 |
| 品牌模仿 | 域名模仿知名品牌 | 500+品牌数据库,复合TLD支持 |
| MCP协议注入 | web内容中的JSON-RPC注入 | DOM/脚本中的7种MCP特定威胁模式 |
因果网络沙盒
基于证据的网络安全分析,灵感来自渲染管道内部:
| 组件 | 它产生什么 |
|---|---|
| 页面捆绑包 | SHA256哈希值、内容长度、资源计数、阻塞资源 |
| DOM分析 | 隐藏的iframe、欺骗性表单、带有CSS选择器的可疑脚本 |
| A11y树 | 欺骗性标签检测(aria标签不匹配) |
| 网络跟踪 | 从脚本/表单/图像中提取URL,标记可疑域 |
| 双子座判决 | 结构化分类(良性/网络钓鱼/恶意软件/点击劫持/骗局),附证据参考 |
安全控制(P0)
| 威胁 | 控制 | 实施 |
|---|---|---|
| 上海光源 | IP验证 | 阻止RFC 1918、元数据(169.254.x.x)、危险端口 |
| 快速注射 | 内容隔离 | 剥离隐藏元素,零宽度Unicode, <analysis_boundary> 信封 |
| 资源耗竭 | 硬限制 | 2MB HTML,15秒超时,3个重定向,50K DOM元素 |
快速启动(30秒)
# Clone and setup
git clone https://github.com/minorumochizuki2015-ship-it/mcp-gateway-gemini3.git
cd mcp-gateway-gemini3
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
# Demo mode (no auth required, instant start)
MCP_GATEWAY_DEMO_MODE=true \
MCP_GATEWAY_ADMIN_TOKEN=demo \
python -m uvicorn src.mcp_gateway.gateway:app --host 127.0.0.1 --port 4100
# Open Dashboard → Click "Run Live Pipeline"
# http://127.0.0.1:4100/docs/ui_poc/dashboard.html
使用Gemini AI
export GOOGLE_API_KEY="your-api-key"
MCP_GATEWAY_ADMIN_TOKEN=your-token \
python -m uvicorn src.mcp_gateway.gateway:app --host 127.0.0.1 --port 4100
Docker(一个命令)
mkdir -p .local
echo "your-admin-token" > .local/admin_token.txt
echo "your-upstream-key" > .local/upstream_api_key.txt
GOOGLE_API_KEY="your-api-key" docker compose up --build
# Dashboard: http://localhost:4100
云运行(谷歌云)
# 1. Create secrets in Secret Manager
echo -n "your-admin-token" | gcloud secrets create admin-token --data-file=-
echo -n "your-api-key" | gcloud secrets create google-api-key --data-file=-
# 2. Deploy with Cloud Build
gcloud builds submit --config=cloudbuild.yaml
# 3. Access your public URL
gcloud run services describe mcp-gateway --format='value(status.url)'
建筑
+------------------+
| AI Clients |
| (ChatGPT/Claude |
| /Gemini CLI) |
+--------+---------+
|
+--------v---------+
| MCP Gateway | ← Python FastAPI
| + Dashboard UI | 6-layer security pipeline
+--+--+--+--+-----+
| | | |
+------------+ | | +------------+
| | | |
+------v------+ +-----v------+ +----v-----+ +------v------+
| AI Council | | Semantic | | RedTeam | | Causal Web |
| (Gemini 3) | | Scanner | | Gen+Eval | | Sandbox |
| | | (Gemini 3) | |(Gemini 3)| | (Gemini 3) |
+------+------+ +-----+------+ +----+-----+ +------+------+
| | | |
+-------+-------+------+------+------+-------+
| | |
+--------v-------+ +---v--------------v---+
| Evidence Trail | | Memory Ledger (SSOT) |
| (JSONL) | | Hash-based dedup |
+-----------------+ +---------------------+
配置
| 变量 | 描述 | 默认值 |
|---|---|---|
GOOGLE_API_KEY |
Gemini API密钥 | 人工智能功能所需 |
GEMINI_MODEL |
Gemini型号名称 | gemini-3-flash-preview |
MCP_GATEWAY_ADMIN_TOKEN |
管理员身份验证 | 必需 |
MCP_GATEWAY_DEMO_MODE |
跳过演示的身份验证 | false |
MCP_GATEWAY_UPSTREAM_API_KEY |
上游LLM API密钥 | 代理必需 |
LEDGER_PATH |
内存分类账JSONL | 可选(启用SSOT) |
LEDGER_ERROR_POLICY |
分类账错误处理 | closed (故障关闭) |
测试套件
# 416 tests
python -m pytest tests/ -v
# Gemini integration tests only
python -m pytest tests/test_council.py tests/test_scanner.py \
tests/test_redteam.py tests/test_causal_sandbox.py -v
基准
基于规则与Gemini 3的可重复检测基准比较:
# Rule-based only (no API key needed)
python scripts/benchmark.py
# Full comparison with Gemini 3
GOOGLE_API_KEY=xxx python scripts/benchmark.py --gemini
| 方法 | 精确度 | 召回率 | F1 | 平均延迟 |
|---|---|---|---|---|
| 基于规则 | 0.917 | 0.846 | 0.880 | <1ms |
| 双子座3号代理 | 1.000 | 1.000 | 1.000 | ~2500ms |
26例固定语料库:13例良性+13例恶意(DGA、品牌冒充、可疑TLD、MCP注射、leet speak、同形异义词)。
API终点(共50个)
核心管道
| 方法 | 路径 | 描述 |
|---|---|---|
| 职位 | /api/scans |
运行安全扫描+高级攻击检测 |
| 职位 | /api/council/evaluate/{id} |
AI委员会裁决 |
| 职位 | /api/web-sandbox/scan |
因果网络沙盒分析 |
| 职位 | /api/redteam/generate |
生成攻击场景 |
| 职位 | /api/redteam/evaluate |
评估工具安全性 |
MCP工具拦截(新)
| 方法 | 路径 | 描述 |
|---|---|---|
| 职位 | /api/mcp/intercept |
拦截MCP工具调用,两层扫描 |
| 得到 | /api/mcp/intercept/history |
最近的拦截结果 |
| 得到 | /api/mcp/intercept/stats |
拦截统计 |
审核质量保证和自我调整
| 方法 | 路径 | 描述 |
|---|---|---|
| 职位 | /api/audit-qa/chat |
请Gemini解释安全决策(第7次集成) |
| 得到 | /api/self-tuning/suggestion |
建议的重量调整及其理由 |
| 职位 | /api/self-tuning/apply |
应用重量建议(有证据) |
管理
| 方法 | 路径 | 描述 |
|---|---|---|
| 得到 | /api/dashboard/summary |
仪表板KPI数据 |
| 得到 | /api/allowlist |
列出MCP服务器 |
| 职位 | /api/allowlist/{id}/register |
注册MCP服务器 |
| 得到 | /api/audit-log |
证据线索 |
| 得到 | /api/demo/run-live |
SSE带电管道 |
证据线索
每个决策都会产生JSONL证据。当 LEDGER_PATH 设置后,事件将通过基于哈希的重复数据删除双重写入内存分类账(SSOT):
{"event": "source_sink_check", "decision": "deny", "server_id": "evil-mcp", "reason": "untrusted_to_restricted_sink"}
{"event": "council_decision", "eval_method": "gemini", "verdict_confidence": 0.95}
{"event": "causal_web_scan", "classification": "phishing", "confidence": 0.92, "recommended_action": "block"}
{"event": "attack_detection", "code": "tool_shadowing", "tool_name": "read_fi1e", "status": "blocked"}
全栈(Docker)
mkdir -p .local
echo "your-admin-token" > .local/admin_token.txt
echo "your-upstream-key" > .local/upstream_api_key.txt
echo "your-google-api-key" > .local/google_api_key.txt
docker compose up --build
关键文件
src/mcp_gateway/
gateway.py # FastAPI gateway (4900+ lines) — routing, policy, SSE pipeline
ai_council.py # Gemini 3 → CouncilVerdict
scanner.py # Static + Semantic + Advanced Attack Detection
redteam.py # Attack generation + safety evaluation
causal_sandbox.py # Evidence-based web security (Gemini 3)
mcp_security_server.py # MCP Security Server (stdio + HTTP transport)
sanitizer.py # Multi-level prompt injection defense
evidence.py # JSONL evidence trail + Memory Ledger
ssot/ # Memory Ledger (persistent SSOT) + Durable Streams
registry.py # MCP server registration and management
docs/ui_poc/ # Dashboard UI (9 pages, bilingual EN/JA)
Dockerfile # Cloud Run deployment
docker-compose.yml # One-command full stack deployment
cloudbuild.yaml # Google Cloud Build config
透明安全:工具调用自动扫描
当AI代理通过 /run MCP网关代理 自动扫描任何URL参数 在转发到上游MCP服务器之前:
Agent calls: browser_navigate(url="https://suspicious-site.tk/login")
│
▼
┌─────────────────────────┐
│ 1. Extract URL params │ url, uri, href, target, destination, page
│ 2. Fast scan (<5ms) │ DGA, TLD, brand, SSRF check
│ 3. Deep scan (if warn) │ DOM + a11y + Gemini 3 analysis
└─────────────────────────┘
│
┌──────┴──────┐
│ │
✅ Allow ❌ Block
Forward to Return 403 +
upstream evidence trail
无需修改代理。 网关透明地扫描带有URL的工具调用。每个拦截决定都会发出证据。
连接AI代理
HTTP上的MCP(流式HTTP传输)
任何兼容MCP的客户端都可以通过HTTP连接到安全网关:
# Initialize
curl -X POST http://localhost:4100/mcp/security \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}'
# Check URL safety (fast scan)
curl -X POST http://localhost:4100/mcp/security \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"check_url","arguments":{"url":"https://example.com"}}}'
# Full security scan with Gemini causal analysis
curl -X POST http://localhost:4100/mcp/security \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"scan_report","arguments":{"url":"https://suspicious-site.tk"}}}'
MCP over stdio(用于本地AI代理)
python -m src.mcp_gateway.mcp_security_server
# Reads/writes JSON-RPC 2.0 with Content-Length framing (LSP-style)
REST API(用于非MCP集成)
# Quick URL check via REST
curl -X POST http://localhost:4100/api/web-sandbox/scan \
-H "Content-Type: application/json" \
-d '{"url":"https://suspicious-site.tk"}'
# MCP tool call interception
curl -X POST http://localhost:4100/api/mcp/intercept \
-H "Content-Type: application/json" \
-d '{"method":"tools/call","params":{"name":"fetch","arguments":{"url":"https://evil.tk"}}}'
安全通知
此网关设计用于 本地/内部网络使用不要直接暴露在公共互联网上。在前面使用身份验证反向代理。
许可证
麻省理工学院
