关于 AegisGate MCP
AegisGate MCP 是用于构建 MCP 服务的 Go 框架,将安全控制纳入请求处理流程。它面向需要身份验证、访问策略、审计和威胁检测的服务部署场景。
主要功能
- 01身份验证与四级 RBAC
- 02策略规则与速率限制
- 03防篡改审计日志
- 04输入与响应扫描
- 05正则与神经网络威胁检测
- 06注册时检查工具投毒
适用场景
- 01按角色限制工具访问
- 02扫描工具输入与响应
- 03审计 MCP 操作
- 04检测提示注入与混淆
MCP 相关
它提供构建 MCP 服务的框架,并对 MCP 请求和工具调用执行安全检查。支持 stdio 与 TCP 传输,并可选 TLS 或双向 TLS。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
docker run -i --rm ghcr.io/aegisgatesecurity/aegisgate-mcp:1.5.1本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
ghcr.io/aegisgatesecurity/aegisgate-mcp:1.5.1Streamable HTTP工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
🛡️ AegisGate MCP
安全的 MCP 服务框架——23 层防御,零依赖。
采用纯 Go 编写的加固型零依赖 MCP 服务。从第一行代码起就内置安全防护,而不是等到遭到入侵后再补救。
Apache 2.0 · 23 层安全防护 · 79 个正则表达式模式 + CharCNN-BiLSTM (v15) ML 检测 · 零 CVE · 零外部模块依赖
AegisGate Security™ 是 AegisGate Security, LLC 的商标,已向 USPTO 申请注册。 “AegisGate MCP”是未注册的产品名称。请参阅下文的商标部分。
为什么选择 AegisGate MCP?
38% 的 MCP 服务没有身份验证。590 多条安全公告。官方 MCP SDK 在 6 个月内出现 3 个严重 CVE——包括 CVSS 9.8 的远程代码执行漏洞,以及影响 1.5 亿多次下载的“AI 供应链之母”漏洞。
官方 MCP SDK 为你提供协议,但不提供安全保障。 没有身份验证。没有审计日志。没有威胁检测。没有速率限制。 没有 RBAC。每个基于基础 SDK 构建的服务,安全状况都一片空白, 而构建安全保障就成了你的责任——或者像 38% 的服务那样,直接跳过。
AegisGate MCP 是安全替代方案。 在从第一行代码起就内置安全防护的 基础上构建 MCP 服务,而不是等到发生泄露后再补上安全措施。
| 官方 MCP SDK | AegisGate MCP | |
|---|---|---|
| 身份验证 | ❌ 自行实现 | ✅ Bearer 令牌 + API 密钥 + 锁定机制 |
| 授权 | ❌ 无 | ✅ 4 级 RBAC,支持按工具设置权限 |
| 审计日志 | ❌ 无 | ✅ 防篡改 SHA-256 哈希链 |
| 威胁检测 | ❌ 无 | ✅ 79 个正则表达式模式 + 神经网络 ML(<1ms) |
| 供应链风险 | ❌ npm/PyPI 依赖 | ✅ 零依赖(仅使用 Go 标准库) |
| CVE | 6 个月内 3 个严重漏洞 | 从未有过 |
| 许可证 | MIT | Apache 2.0 |
23 层安全防护。79 个正则表达式模式。零依赖。零 CVE。Apache 2.0。
需要代理模式、OAuth、SIEM 或合规框架?请参阅下文的 何时升级到 AegisGate Platform—— 或了解 AegisGate Rampart 如何保护本地 AI API 代理。
概述
AegisGate MCP 是一个使用纯 Go 编写、经过强化且零依赖的 MCP 服务。 它位于 AI Agent 与其调用的工具之间,对每个请求应用 23 层 防御——从身份验证和 RBAC 到神经网络威胁检测和链分析。
标准 MCP 服务默认运行在可信的本地环境中。在生产环境中——无论是云端 SaaS 平台、企业数据管道,还是隔离网络中的工厂网络——Agent 都可能执行 命令、查询数据库或与关键系统交互。一次未经授权或恶意的工具调用, 就可能导致数据外泄、流程中断,甚至造成更严重的后果。AegisGate MCP 通过纵深防御保护每次工具调用,并且没有外部模块依赖,因此可以在隔离网络中运行。
| 版本 | 1.6.1 |
| 许可证 | Apache-2.0 |
| Go 版本 | 1.27+ |
| 模块依赖 | 零(没有 require 指令——所有第三方代码均已随项目提供) |
| Docker 镜像 | ML:debian:bookworm-slim(已清除 gnutls),约 127 MB,0 个 CVE · Lite:distroless/static-debian12,约 10 MB,0 个 CVE |
| 架构 | amd64、arm64 |
| ML 模型 | CharCNN-BiLSTM v15,160 万参数,CPU 推理 <1ms |
| 测试 | 611 个单元/集成测试 + 32 个负载/压力测试 = 共 643 个测试,14 个基准测试,3 个模糊测试目标,92.0% 覆盖率(非 CGO)/ 91.9%(CGO) |
快速开始
构建
go build -o mcp-server ./cmd/mcp-server
运行
# Basic TCP server on :8081
./mcp-server
# With authentication and audit logging
./mcp-server --token my-secret --audit /var/log/mcp-audit.json
# With demo tools (ping, system_info, echo)
./mcp-server --demo
# stdio mode for local MCP clients (Claude Desktop, Cursor)
./mcp-server --transport stdio --demo
# Streamable HTTP mode (MCP 2025-06-18)
./mcp-server --transport http --addr :8081 --demo
# TLS + mutual TLS
./mcp-server --tls --tls-cert server.pem --tls-key server.key --tls-client-ca ca.pem
# Config file + health endpoint
./mcp-server --config /etc/mcp/config.json --health-addr :8082
Docker
# Build and run (ML-enabled, ~127 MB, 0 CVEs)
docker build --target ml -t aegisgate-mcp .
docker run -p 8081:8081 aegisgate-mcp --demo
# With authentication and audit logging
docker run -p 8081:8081 \
-e MCP_AUTH_TOKEN=your-secret-token \
-e MCP_DEMO_TOOLS=true \
aegisgate-mcp
# Distroless heuristic-only build (~10 MB, 0 CVEs, zero OS packages)
docker build --build-arg CGO_ENABLED=0 --target lite -t aegisgate-mcp:lite .
docker run -p 8081:8081 aegisgate-mcp:lite --demo
ML 镜像使用 debian:bookworm-slim,并清除了 libgnutls30(移除共享
库和 dpkg 元数据),从而消除全部 6 个 Trivy CVE,同时保留神经网络
推理所需的 glibc 和 ONNX Runtime 依赖。Lite 镜像是真正的 distroless
镜像(gcr.io/distroless/static-debian12:nonroot)——没有 OS 软件包,
没有 CVE,约 10 MB。两个目标都内置了 --health-check 标志,可供
Docker HEALTHCHECK 使用(无需 wget/curl)。多架构构建支持
linux/amd64 和 linux/arm64。
ML 威胁检测(L3)
AegisGate MCP 使用与 AegisGate Platform 和 Rampart 相同的 CharCNN-BiLSTM v15 神经模型,并以 vendored 方式集成,不依赖任何外部模块。该模型提供:
- 语义攻击检测 — 捕获可绕过正则表达式模式匹配的提示词注入和越狱尝试
- 规避抵抗能力 — 检测混淆技术(leet 文字、Unicode 同形字、字符换位、删除元音、单词反转)
- 双层阻止机制 — 分数 ≥0.95 时独立阻止;分数为 0.50–0.94 时,仅在有 L1(正则表达式)或 L2(输入扫描器)佐证时阻止
- 影子模式 — 记录预测结果但不阻止(用于校准)
- 启发式回退 — 当 CGO 不可用时,启发式评分可在不使用 ONNX 的情况下提供基础检测能力
| 标志 | 环境变量 | 默认值 | 说明 |
|---|---|---|---|
--ml | MCP_ML_ENABLED | false(CLI)/ true(Docker) | 启用神经威胁检测 |
--ml-shadow | MCP_ML_SHADOW | false | 记录预测结果,但从不阻止 |
--ml-threshold | MCP_ML_THRESHOLD | 0.50 | 威胁分数阈值(0.0–1.0) |
--ml-model | MCP_ML_MODEL | ./models/threat_cnn_bilstm.onnx | ONNX 模型文件路径 |
库的用法
AegisGate MCP 可作为 Go 库嵌入:
package main
import (
"context"
"log"
mcp "github.com/aegisgatesecurity/aegisgate-mcp"
)
func main() {
cfg := mcp.DefaultServerConfig()
cfg.AuthToken = "my-secret-token"
cfg.AuditLogPath = "/var/log/mcp-audit.json"
cfg.RateLimitRPM = 120
cfg.ScanResponses = true
server, err := mcp.NewSecuredMCPServer(cfg)
if err != nil {
log.Fatal(err)
}
// Register a custom tool
// Note: tools are automatically scanned for prompt-injection poisoning
// at registration time. If the description or inputSchema contains
// malicious patterns, RegisterTool returns *ToolPoisoningError.
server.RegisterTool("my_tool", "Does something useful", 40, map[string]interface{}{
"type": "object",
"properties": map[string]interface{}{
"param1": map[string]interface{}{"type": "string"},
},
"required": []interface{}{"param1"},
})
server.RegisterToolHandler("my_tool", func(ctx context.Context, params map[string]interface{}) (interface{}, error) {
return "result", nil
})
// Register a resource (MCP resources/list, resources/read)
server.RegisterResource("config://app/info", "App Info", "App config as JSON", "application/json",
func(ctx context.Context, uri string) (*mcp.ResourceContent, error) {
return &mcp.ResourceContent{URI: uri, Text: `{"version":"1.0"}`, MimeType: "application/json"}, nil
})
// Register a prompt (MCP prompts/list, prompts/get)
server.RegisterPrompt("code_review", "Generate a code review prompt",
[]mcp.PromptArgument{{Name: "filename", Required: true}},
func(ctx context.Context, args map[string]string) (*mcp.GetPromptResult, error) {
return &mcp.GetPromptResult{
Messages: []mcp.PromptMessage{{Role: "user", Content: "Review " + args["filename"]}},
}, nil
})
// Load built-in policy rules
server.LoadDefaultPolicies()
// Start the server
if err := server.Start(context.Background()); err != nil {
log.Fatal(err)
}
defer server.Stop()
}
请参阅 examples/simple-server/,查看注册工具、资源和提示词的完整可运行示例。
ML 模型热切换
无需重启服务,即可在运行时重新加载神经威胁检测模型:
// Swap to a new ONNX model file (verifies SHA-256 hash)
err := server.ReloadMLModel("/path/to/new_model.onnx")
if err != nil {
log.Printf("model reload failed: %v", err)
}
工具投毒检测
通过 RegisterTool() 注册的所有工具,都会自动扫描其描述和 inputSchema 中是否存在提示词注入。若要手动扫描:
err := server.ScanToolForPoisoning("my_tool", description, inputSchema)
if err != nil {
// err is *ToolPoisoningError — do not register this tool
}
安全层
AegisGate MCP 按顺序对每个请求应用 23 个安全层:
| # | 层 | 描述 | 来源 |
|---|---|---|---|
| 1 | 身份验证 | Bearer 令牌 + API 密钥,恒定时间比较,重复失败时自动锁定 | auth.go |
| 2 | 签名验证 | ECDSA P-256 防伪造——根据受信任的公钥验证消息签名 | auth.go |
| 3 | 会话管理 | 256 位密码学安全随机会话 ID、过期机制、防劫持检查 | session.go |
| 4 | RBAC | 4 级角色层级(受限 → 标准 → 特权 → 管理员),按工具设置权限 | rbac.go |
| 5 | 策略引擎 | 带有条件、优先级、时间窗口和参数模式的允许/拒绝规则 | policy.go |
| 6 | 护栏 | 按会话设置工具调用限制和速率限制 | guardrails.go |
| 7 | 链分析 | 检测权限提升、数据外泄链和重复的危险工具调用 | guardrails.go |
| 8 | 令牌桶速率限制 | 使用令牌桶算法的滑动窗口速率限制(每分钟请求数 + 突发容量) | guardrails.go |
| 9 | 输入扫描 | 执行前扫描工具参数中的提示词注入(约 79 种模式) | handler.go、scanner.go |
| 10 | 响应扫描 | 扫描工具响应中的个人身份信息、机密、XSS 和提示词注入(约 79 种检测模式) | scanner.go |
| 11 | 机密信息脱敏 | 在将响应返回给客户端之前,清除其中的敏感数据(个人身份信息、机密) | scanner.go |
| 12 | 工具执行超时 | 可配置的单次调用超时,防止工具挂起或失控 | handler.go |
| 13 | STDIO 验证 | 通过针对 stdio 传输命令的允许列表和阻止列表防止 Shell 注入 | stdio_guard.go |
| 14 | 审计日志记录 | 所有 MCP 操作均记录到文件和内存中,可供合规查询,并使用防篡改哈希链 | audit.go |
| 15 | TLS / mTLS 传输 | 加密 TCP 连接,可选择启用双向 TLS | config.go、server.go |
| 16 | stdio 传输 | 适用于 Claude Desktop、Cursor 和其他本地集成的标准 MCP 客户端传输方式 | transport.go |
| 17 | 健康检查端点 | 在单独的侦听器上提供 HTTP /healthz、/readyz、/stats 端点 | transport.go |
| 18 | 参数验证 | 执行前根据每个工具的 inputSchema 检查必填字段 | handler.go |
| 19 | 神经网络威胁检测(L3) | CharCNN-BiLSTM v15 模型可对正则表达式无法检测到的语义攻击和规避变体进行评分。双层拦截:≥0.95 时独立拦截,0.50–0.94 时需 L1/L2 提供佐证 | internal/ml/ |
| 20 | 启发式规避检测 | 检测字母换位、删除元音、单词反转、leet 语、编码、拆分和零宽字符混淆 | internal/ml/evasion_resistance.go |
| 21 | NFKC Unicode 规范化 | 扫描前将 Unicode 兼容字符映射为规范形式,从而抵御同形异义字和连字攻击(全角 Ignore → ignore) | internal/ml/normalizer.go |
| 22 | 工具投毒检测 | 注册时递归扫描工具描述和 inputSchema 中的提示词注入(来自 AegisGate Scanner 的 34 种危险函数模式),在被污染的工具可被调用前将其拒绝。对应 OWASP MCP Top 10 M1 | handler.go |
| 23 | 规避检测(L2.5) | 15 种正则表达式模式可检测编码(base64、URL、Unicode、HTML 实体)、拆分(零宽字符、交错)、混淆(leet 语、填充、标记)和语义规避(角色扮演框架、指令覆盖)。评分 ≥ 0.8 时独立拦截;≥ 0.3 时记录警告。在 L1 正则检测和 L3 神经网络检测之间运行 | internal/ml/evasion_resistance.go |
检测模式类别(79 种模式)
AegisGate MCP 使用 8 个类别的 79 种正则表达式模式扫描所有工具参数和响应:
| 类别 | 模式数量 | 示例 |
|---|---|---|
| 提示词 | 25 | 忽略先前指令、角色扮演升级、RAG 偷渡、系统提示词泄露、分隔符注入、Base64 载荷 |
| 危险函数 | 34 | eval()、exec()、os.system()、subprocess(shell=True)、pickle.loads()、child_process.exec() |
| 凭据 | 6 | AWS 密钥、GitHub PAT、JWT 令牌、RSA 私钥、通用 API 密钥 |
| 金融 | 3 | 信用卡(Visa、Mastercard、Amex) |
| 网络 | 3 | 网络地址、OPC UA、Modbus、DNP3 |
| PII | 2 | SSN、电子邮件 |
| XSS | 3 | Script 标签、SVG onload、image onerror |
| 合规性 | 3 | OWASP LLM01/02/06 |
⚙️ 配置
配置优先级
配置按从高到低的优先级顺序解析:
- CLI 标志 — 覆盖所有其他配置
- 环境变量 — 覆盖配置文件
- JSON 配置文件(
--config)— 覆盖内置默认值 - 内置默认值
CLI 标志
所有 CLI 标志都有对应的环境变量:
| 标志 | 环境变量 | 默认值 | 描述 |
|---|---|---|---|
--addr | MCP_SERVER_ADDR | :8081 | 监听地址(TCP 模式) |
--transport | MCP_TRANSPORT | tcp | 传输模式:tcp、stdio 或 http(Streamable HTTP) |
--token | MCP_AUTH_TOKEN | (empty) | 用于身份验证的 Bearer 令牌 |
--audit | MCP_AUDIT_LOG | (empty) | 审计日志文件路径 |
--max-sessions | MCP_MAX_SESSIONS | 50 | 最大并发会话数 |
--max-connections | MCP_MAX_CONNECTIONS | 1000 | 最大并发 TCP 连接数(-1 = 不限) |
--rate-limit | MCP_RATE_LIMIT_RPM | 60 | 速率限制(请求/分钟) |
--exec-timeout | MCP_EXEC_TIMEOUT | 30 | 工具执行超时时间(秒) |
--scan-responses | MCP_SCAN_RESPONSES | true | 启用响应扫描 |
--block-pii | MCP_BLOCK_PII | true | 阻止包含 PII 的响应 |
--block-secrets | MCP_BLOCK_SECRETS | true | 阻止包含密钥的响应 |
--block-xss | MCP_BLOCK_XSS | true | 阻止包含 XSS 的响应 |
--block-prompt-inject | MCP_BLOCK_PROMPT_INJECT | true | 阻止包含提示词注入的响应 |
--redact | MCP_REDACT_ENABLED | false | 启用密钥/PII 脱敏 |
--redact-pii | MCP_REDACT_PII | false | 对响应中的 PII 脱敏 |
--redact-secrets | MCP_REDACT_SECRETS | true | 对响应中的密钥脱敏 |
--redact-placeholder | MCP_REDACT_PLACEHOLDER | [REDACTED] | 脱敏占位文本 |
--tls | MCP_TLS_ENABLED | false | 启用 TLS 传输 |
--tls-cert | MCP_TLS_CERT | (empty) | 服务端证书文件(PEM) |
--tls-key | MCP_TLS_KEY | (empty) | 服务端私钥文件(PEM) |
--tls-client-ca | MCP_TLS_CLIENT_CA | (empty) | 客户端证书的 CA 证书包(启用 mTLS) |
--tls-min-version | MCP_TLS_MIN_VERSION | 1.2 | 最低 TLS 版本:1.2 或 1.3 |
--health-addr | MCP_HEALTH_ADDR | (empty) | 健康检查端点监听地址(为空 = 禁用) |
--config | MCP_CONFIG_FILE | (empty) | JSON 配置文件路径 |
--demo | MCP_DEMO_TOOLS | false | 注册演示工具(ping、system_info、echo) |
--ml | MCP_ML_ENABLED | false | 启用神经网络威胁检测(L3,需要 CGO 构建) |
--ml-shadow | MCP_ML_SHADOW | false | ML 影子模式:记录预测结果,但从不拦截 |
--ml-threshold | MCP_ML_THRESHOLD | 0.50 | ML 威胁评分阈值(0.0–1.0) |
--ml-model | MCP_ML_MODEL | ./models/threat_cnn_bilstm.onnx | ONNX 模型文件路径 |
JSON 配置文件
{
"address": ":8081",
"auth_token": "my-secret-token",
"audit_log_path": "/var/log/mcp-audit.json",
"max_sessions": 100,
"max_connections": 1000,
"rate_limit_rpm": 120,
"exec_timeout_seconds": 30,
"scan_responses": true,
"block_on_pii": true,
"block_on_secrets": true,
"block_on_xss": true,
"block_on_prompt_inject": true,
"redact_enabled": true,
"redact_pii": true,
"redact_secrets": true,
"redact_placeholder": "[REDACTED]",
"tls_enabled": true,
"tls_cert_file": "/etc/ssl/mcp/server.pem",
"tls_key_file": "/etc/ssl/mcp/server.key",
"tls_client_ca_file": "/etc/ssl/mcp/ca.pem",
"tls_min_version": "1.3",
"demo_tools": true
}
传输模式
| 模式 | 标志 | 描述 |
|---|---|---|
tcp | --transport tcp (default) | TCP 监听器,支持 TLS/mTLS 加密,适用于网络部署 |
stdio | --transport stdio | 面向本地客户端(Claude Desktop、Cursor)的标准 MCP stdin/stdout 传输 |
http | --transport http | Streamable HTTP(MCP 2025-06-18)——向 /mcp 端点发送 POST JSON-RPC 请求,通过 Mcp-Session-Id 管理会话,通过 Accept 标头进行 SSE 流式传输,使用 DELETE 终止会话,支持 TLS 终止反向代理 |
健康检查端点
设置 --health-addr 后,单独的 HTTP 监听器会提供可观测性端点:
| 端点 | 方法 | 描述 |
|---|---|---|
/healthz | GET | 存活探针——如果服务进程正在运行,则返回 200 OK |
/readyz | GET | 就绪探针——如果服务已准备好接受请求,则返回 200 OK |
/stats | GET | 以 JSON 格式返回服务统计信息(会话、速率限制、工具调用、active_connections、max_connections) |
🔐 RBAC 与策略引擎
RBAC 角色
AegisGate MCP 强制实施 4 级角色层次结构。角色顺序为:restricted < standard < privileged < admin。
| 角色 | 级别 | 访问权限 | 工具示例 |
|---|---|---|---|
restricted | 0 | 仅限只读工具 | ping、system_info、file_exists、git_status、git_log |
standard | 1 | 读取 + 低风险写入 | file_read、code_search、web_search、file_copy |
privileged | 2 | 除高风险执行以外的所有功能 | 除 shell_command、code_execute 以外的所有工具 |
admin | 3 | 所有工具,不受限制 | 所有已注册工具 |
角色比较使用 AgentRole.AtLeast()——privileged Agent 可以访问任何要求 standard 或 restricted 的工具,但不能访问要求 admin 的工具。
策略引擎
策略引擎会在任何工具执行前评估允许/拒绝规则。规则支持:
- 工具名称匹配——精确名称和通配符模式
- Agent 角色条件——仅对特定角色应用规则
- 风险分数阈值——在达到
RiskAbove值时触发 - 优先级——优先评估高优先级规则
- 时间范围——将工具限制在特定时间范围内
- 参数模式——匹配工具调用参数
- 操作——允许、拒绝(附带原因)、日志级别、风险修饰符
内置策略规则
通过 LoadDefaultPolicies() 加载:
| 规则 ID | 优先级 | 操作 | 条件 | 描述 |
|---|---|---|---|---|
block-shell-commands | 100 | 拒绝 | 工具名称:shell_command、bash、exec、cmd、terminal;角色:restricted、standard、privileged | Shell 命令需要 admin 角色 |
block-file-delete | 90 | 拒绝 | 工具名称:file_delete、rm、unlink、remove;角色:restricted、standard | 删除文件需要 privileged 或 admin 角色 |
block-network-write | 80 | 拒绝 | 工具名称:http_request、web_search、fetch_url、curl、wget;角色:restricted | restricted Agent 不允许执行网络操作 |
alert-high-risk | 50 | 允许 + 警报 | 风险分数 > 70 | 标记高风险操作,以便进行审计日志记录 |
可以通过编程方式添加自定义规则:
server.AddPolicyRule(mcp.PolicyRule{
ID: "block-after-hours",
Name: "Block Dangerous Tools After Hours",
Description: "No high-risk tools outside business hours",
Condition: mcp.RuleCondition{
ToolNames: []string{"shell_command", "file_delete"},
TimeWindow: &mcp.TimeWindow{
Start: "08:00",
End: "18:00",
},
},
Action: mcp.RuleAction{
Allow: false,
DenyReason: "High-risk tools only available during business hours",
LogLevel: "warn",
},
Priority: 75,
Enabled: true,
})
链路分析器会跟踪会话中的工具调用序列(滚动窗口为 20 次调用),并标记可疑模式:
| 检测项 | 标记 | 触发条件 |
|---|---|---|
| 权限提升 | privilege_escalation | 低风险工具调用后接高风险工具(shell_command、file_delete、db_query) |
| 数据外泄 | data_exfiltration_chain | 读取敏感数据(file_read、db_query、code_search)后进行外部写入(http_request、file_write、web_search) |
| 重复调用危险工具 | repeated_dangerous_tools | 在分析窗口内调用高风险工具 3 次或以上 |
出现任一标记时,链路风险将设为高,并以 WARN 级别记录事件,其中包含会话 ID、标记和调用次数。
✍️ 签名验证
AegisGate MCP 支持 ECDSA P-256 消息签名,以防止请求伪造和篡改。
客户端对每个请求的规范 JSON 进行签名(将 Signature 和 KeyID 字段置零),
并在请求标头中包含签名。
服务端设置
server, _ := mcp.NewSecuredMCPServer(cfg)
// Register a trusted client public key (SEC1 encoded)
server.AddTrustedKey("agent-001", clientPubKeySEC1)
客户端签名(示例)
import (
"crypto/ecdsa"
"crypto/sha256"
"crypto/rand"
"encoding/hex"
)
func signRequest(privKey *ecdsa.PrivateKey, canonicalJSON []byte) string {
hash := sha256.Sum256(canonicalJSON)
sig, _ := ecdsa.SignASN1(rand.Reader, privKey, hash[:])
return hex.EncodeToString(sig)
}
服务端使用 ecdsa.VerifyASN1 根据受信任的公钥验证签名。
如果不存在 KeyID 或 Signature,则跳过验证——允许与未签名的客户端互操作,
同时强制提供这些信息的客户端使用签名。
🧪 测试与性能
测试覆盖率
| 类别 | 测试数 | 覆盖率 |
|---|---|---|
| 单元测试 + 集成测试(非 CGO) | 611 | 92.0% |
| 单元测试 + 集成测试(CGO + ML) | 611 | 91.9% |
负载 / 压力 / 突发 / 极限 / 混沌测试(构建标签:load) | 32 | — |
| 基准测试 | 14 | — |
| 模糊测试目标 | 3 | — |
| 竞态检测器 | ✅ 无问题 | — |
运行测试
# Non-CGO test suite (heuristic-only, no ONNX)
CGO_ENABLED=0 go test ./... -count=1 -timeout 120s
# CGO test suite (full ML, requires libonnxruntime.so)
CGO_ENABLED=1 CGO_LDFLAGS="-L$(pwd)/lib/amd64 -lonnxruntime" go test ./... -count=1 -timeout 120s
# With race detector (CGO only — -race requires CGO)
CGO_ENABLED=1 CGO_LDFLAGS="-L$(pwd)/lib/amd64 -lonnxruntime" go test -race -count=1 -timeout 300s ./...
# Load/stress/burst/crush/chaos tests (behind build tag)
go test -tags=load -count=1 -timeout 600s -v ./...
# Benchmarks (regression tracking)
go test -bench=. -benchmem -benchtime=5s ./...
# Fuzz testing (run for 60 seconds per target)
go test -fuzz=FuzzHandleRequest -fuzztime=60s ./...
性能特征
通过 k6 风格的负载测试套件(//go:build load)验证:
核心性能
| 指标 | 数值 | 测试 |
|---|---|---|
| 持续吞吐量 | 14,427 req/sec | TestLoadSustainedThroughput |
| p50 延迟(100 个并发连接) | 34 ms | TestLoadConcurrentConnections |
| p99 延迟(100 个并发连接) | 46 ms | TestLoadConcurrentConnections |
| 连接周转率 | 2,662 conn/sec | TestConnectionChurn |
| Goroutine 泄漏(浸泡 10 秒) | 0 | TestSoakStability |
| 负载下的优雅关闭 | 1.6 ms | TestShutdownUnderLoad |
| 指标 | 值 | 测试 |
|---|---|---|
| 压力递增(500 个连接) | 成功率 100%,p99=65ms,738 rps | TestStressRampUp |
| 突发请求峰值(1000 个请求) | 12,710 req/sec | TestBurstRequestSpike |
| 突发恢复 | 0.99× 基线(即时) | TestBurstRecovery |
| 超过 MaxConnections 的极限测试 | 已限制,且服务端响应正常 | TestCrushBeyondMaxConnections |
| Goroutine 泄漏(500 次更替) | Δ=0 | TestCrushGoroutineExplosion |
| FD 泄漏(500 次更替,5 轮) | Δ=1 | TestFDLeak |
| 负载下的平滑关闭 | 1.6ms(50 个活动生成器) | TestChaosShutdownUnderLoadTCP |
| HTTP 并发(50 个客户端) | 2,290 rps,p99=16ms | TestHTTPLoadConcurrent |
| HTTP 持续负载(20×30 次 ping) | 无 Goroutine 泄漏 | TestHTTPLoadSustained |
| 跨传输方式延迟 | HTTP 为 TCP 的 0.62× | TestCrossTransportLatency |
| 随机丢包混沌测试(30%) | 服务端全程正常运行 | TestChaosRandomDrops |
| 畸形请求洪泛(500 个混合请求) | 服务端全程正常运行 | TestCrushMalformedFlood |
📦 零模块依赖
AegisGate MCP 没有任何外部模块依赖。go.mod 文件中不包含
require 指令。所有第三方代码(ONNX Runtime 绑定、Unicode
规范化、ML 模型)均已存放在 internal/、lib/ 和 models/ 中。
module github.com/aegisgatesecurity/aegisgate-mcp
go 1.26.9
// Zero external module dependencies (no `require` directives).
// All third-party code is vendored into internal/ — see NOTICE for details.
已存放的组件(完整归属信息请参阅 NOTICE):
| 组件 | 许可证 | 位置 |
|---|---|---|
| onnxruntime_go(Go 绑定) | MIT | internal/onnxruntime_go/ |
| libonnxruntime.so(Microsoft) | MIT | lib/amd64/、lib/arm64/ |
| golang.org/x/text(Unicode 规范化) | BSD-3-Clause | internal/textnorm/ |
| CharCNN-BiLSTM v15 模型 | Apache-2.0 | models/ |
这为什么重要:
- 隔离网络环境部署 — 无需执行
go mod download,不存在供应链风险 - 无传递依赖 — 除已存放的代码外,无其他内容需要审计
- 可复现构建 — 多次构建生成的二进制文件完全相同
- 最小攻击面 — 所有第三方代码均可查看和审计
- 快速编译 — 无需承担依赖解析开销
🏗️ 架构与协议
架构
┌─────────────────────────────────────────────────────────────────────────┐
│ AegisGate MCP Server │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ TCP Mode: │
│ ┌──────────┐ ┌──────────────┐ ┌───────────┐ ┌──────────────┐ │
│ │ TCP │───▶│ Auth │───▶│ Guardrails│───▶│ Response │ │
│ │ Client │ │ Middleware │ │ (Rate + │ │ Scan │ │
│ │ │ │ (Token + │ │ Chain) │ │ (PII/Secrets │ │
│ │ (TLS/ │ │ Signature + │ │ │ │ /XSS/Inject)│ │
│ │ mTLS) │ │ Session) │ │ │ │ │ │
│ └──────────┘ └──────────────┘ └───────────┘ └──────┬───────┘ │
│ │ │
│ ▼ │
│ stdio Mode: ┌──────────────────────┐ │
│ ┌──────────┐ (same security chain, │ Request Handler │ │
│ │ stdin / │ stdin/stdout instead │ ┌────────────────┐ │ │
│ │ stdout │ of TCP) │ │ RBAC Check │ │ │
│ └──────────┘ │ ├────────────────┤ │ │
│ │ │ Policy Engine │ │ │
│ │ ├────────────────┤ │ │
│ │ │ Param Validate│ │ │
│ │ ├────────────────┤ │ │
│ │ │ Tool Registry │ │ │
│ │ │ + Exec Timeout│ │ │
│ │ └────────────────┘ │ │
│ └──────────────────────┘ │
│ │
│ Health Endpoint (separate HTTP listener): │
│ ┌────────────────────────────────────────┐ │
│ │ GET /healthz → liveness │ │
│ │ GET /readyz → readiness │ │
│ │ GET /stats → server statistics │ │
│ └────────────────────────────────────────┘ │
│ │
│ Audit Log: all MCP actions → file + in-memory (queryable) │
└─────────────────────────────────────────────────────────────────────────┘
请求流程:
- TCP 客户端连接(可选使用 TLS/mTLS),或由 stdio 通过 stdin 发送 JSON-RPC
- 身份验证中间件验证 bearer token/API key(采用恒定时间比较),验证 ECDSA 签名,并创建/验证会话
- 防护措施实施速率限制和会话限制,并运行链分析
- 响应扫描(执行前的参数验证在处理程序中进行)
- 请求处理程序检查 RBAC 权限,评估 Policy Engine 规则,根据
inputSchema验证必需参数,并在超时时限内执行工具 - 响应扫描(执行后)扫描工具输出中的 PII、机密信息、XSS 和提示词注入;启用时进行脱敏
- 审计日志记录完整的操作链
AegisGate MCP 实现以下 JSON-RPC 方法(MCP 协议 2025-06-18):
| 方法 | 类型 | 描述 |
|---|---|---|
initialize | 请求 | 解析 clientInfo,返回 serverInfo 和功能(工具、资源、提示词、日志记录) |
notifications/initialized | 通知 | 静默处理——不发送响应(符合 MCP 规范) |
notifications/cancelled | 通知 | 由客户端发起的取消——记录日志,不发送响应 |
notifications/tools/list_changed | 由服务端发起 | 添加或移除工具时发送 |
notifications/resources/list_changed | 由服务端发起 | 添加或移除资源时发送 |
notifications/resources/updated | 由服务端发起 | 已订阅资源的内容发生变化时发送 |
notifications/prompts/list_changed | 由服务端发起 | 添加或移除提示词时发送 |
tools/list | 请求 | 返回已注册工具及其描述和 inputSchema。支持基于游标的分页 |
tools/call | 请求 | 通过所有安全层检查后执行工具 |
resources/list | 请求 | 返回已注册资源(URI、名称、描述)。支持基于游标的分页 |
resources/read | 请求 | 根据 URI 读取资源——调用已注册的 ResourceHandlerFunc |
resources/templates/list | 请求 | 返回已注册的参数化资源 URI 模板 |
resources/subscribe | 请求 | 订阅会话对某个 URI 的资源更新通知 |
resources/unsubscribe | 请求 | 移除资源订阅 |
prompts/list | 请求 | 返回已注册的提示词(名称、描述、参数)。支持基于游标的分页 |
prompts/get | 请求 | 根据名称和可选参数获取提示词——调用已注册的 PromptHandlerFunc |
ping | 请求 | 健康检查——返回空成功响应 |
Streamable HTTP 会话管理(v1.2.2+):
- 使用
initialize向/mcp发送POST→ 响应包含Mcp-Session-Id标头 - 使用后续请求向
/mcp发送POST→ 必须包含Mcp-Session-Id标头 - 携带
Mcp-Session-Id标头向/mcp发送DELETE→ 终止会话(204 No Content) - 会话在闲置 30 分钟后过期
🏭 使用场景与部署方案
AegisGate MCP 适用于 AI Agent 与工具交互的各种环境——从云端 SaaS 平台、企业数据管道到 OT/ICS 工厂网络。无论部署环境如何,均适用相同的 21 层安全防护。
常规部署
- 云端 SaaS — 保护面向用户的 AI 功能,防范提示词注入和数据外泄
- 企业数据访问 — 对由 Agent 驱动的数据库查询实施 RBAC 和审计日志记录
- CI/CD 自动化 — 限制 AI 辅助的流水线可执行的操作
- 隔离网络 — 零依赖意味着服务无需访问互联网即可运行
在 OT/ICS 环境中,AegisGate MCP 位于 AI Agent 与关键基础设施工具之间:
AI Agent (Claude, Cursor, custom)
│
▼
┌──────────────────┐
│ AegisGate MCP │ ← 23 security layers
│ (TLS/mTLS) │
└────────┬─────────┘
│
┌────┼────┬────┬────┐
▼ ▼ ▼ ▼ ▼
SCADA PLC Hist Tag Log
Read Status Query DB Analyzer
典型部署场景:
- 只读监控 Agent —
restricted角色,可查询 SCADA 状态和历史记录数据,但无法下达命令 - 维护 Agent —
standard角色,可在故障排查期间读取文件和搜索代码 - 运维 Agent —
privileged角色,可与大多数工具交互,但无法执行 shell 命令 - 管理员 Agent —
admin角色,可在获授权的维护窗口期间完全访问
与 OT/ICS 尤其相关的安全功能:
- TLS/mTLS 会加密工厂网络上的所有流量
- 时间窗口策略 将高风险工具限制在维护窗口期间使用
- 链路分析 可检测 Agent 是否先读取敏感流程数据,随后尝试向外部网络写入数据(数据外泄)
- 审计日志 为合规性(NERC CIP、IEC 62443)提供完整的监管链
- 气隙运行 — 零依赖意味着服务可部署在无法访问互联网的隔离网络中
演示工具
使用 --demo 标志或在库模式下调用 RegisterDemoTools(),即可启用演示工具。
这些工具安全且只读,不会访问文件系统、网络或任何外部资源。
| 工具 | 风险级别 | 必需参数 | 描述 |
|---|---|---|---|
ping | 10 | (无) | 返回 "pong" — 健康检查工具 |
system_info | 30 | (无) | 返回 Go 版本、操作系统、架构、CPU 数量、goroutine 数量和时间戳 |
echo | 20 | message(字符串) | 原样返回提供的消息 |
示例 — system_info 响应:
{
"go_version": "go1.26.9",
"os": "linux",
"arch": "amd64",
"cpus": 8,
"goroutines": 12,
"timestamp": "2026-10-08T08:58:00Z"
}
文档
详细文档位于 docs/ 目录中:
| 文档 | 描述 |
|---|---|
docs/getting-started.md | 安装、首次运行和基本配置 |
docs/deployment-guide.md | 生产环境部署:Docker、TLS、气隙部署 |
docs/admin-guide.md | 管理:会话、审计日志、RBAC 管理、策略 |
docs/how-to-guides.md | 任务指南:自定义工具、签名验证、mTLS 设置 |
docs/building-your-first-server.md | 教程:从零开始构建完整的安全 MCP 服务,包含自定义工具、RBAC 和策略 |
docs/integrating-with-cursor.md | 通过 Streamable HTTP 传输将 Cursor 连接到 AegisGate MCP |
docs/model-card.md | ML 模型详情:架构、训练数据、性能指标 |
docs/comparison.md | 功能比较:AegisGate MCP 与官方 MCP SDK 及附加封装 |
docs/owasp-mcp-top-10.md | OWASP MCP Top 10 风险映射 — 覆盖全部 10 项安全风险 |
docs/v1.3.0-roadmap.md | SSE 流式传输、服务端发起的通知、资源订阅和资源模板路线图(P1–P4 已完成) |
更新日志
版本历史和重要变更请参阅 CHANGELOG.md。
平台互操作(可选)
AegisGate MCP 可选择与 AegisGate Platform 集成,以拉取模式并转发事件:
- 模式拉取:通过 Platform 的遥测端点获取规范检测模式,并使用 ETag 缓存
- 事件转发:以规范合约格式向 Platform 的遥测接收端发送安全事件
- 工具描述筛查:增加 AegisGate Scanner 提供的 34 种危险函数模式
所有互操作功能均兼容气隙环境 — 未配置 platform_url 时会完全禁用。不会进行网络调用、遥测或依赖任何外部项。
何时升级到 AegisGate Platform
AegisGate MCP 是一个独立的安全 MCP 服务框架,非常适合构建和运行内置安全能力的 MCP 服务。它免费、开源,且没有任何外部依赖。
当需求超出单个服务的范围时,AegisGate Platform 是自然的升级选择:
| 需求 | AegisGate MCP(免费) | AegisGate Platform |
|---|---|---|
| 安全 MCP 服务框架 | ✅ 23 层,零依赖 | ✅ 内嵌 MCP 服务 |
| ML 威胁检测 | ✅ 限制为每分钟 100 次(单服务) | ✅ 无限制,覆盖整个组织 |
| 代理/网关模式 | ❌ 框架,不是代理 | ✅ 位于客户端与所有 AI 服务之间 |
| OAuth 2.0 / OIDC / SSO | ❌ Bearer 令牌 + API 密钥 | ✅ SAML、OIDC、JWT |
| SIEM 集成 | ❌ 基于文件的审计 + Prometheus | ✅ Splunk、Elasticsearch、QRadar、Datadog(11 个平台) |
| 合规框架 | ❌ 无 | ✅ 31 个框架(HIPAA、PCI、SOC 2、EU AI Act、NIST 等) |
| 多协议(HTTP、A2A、ACP) | ❌ 仅 MCP | ✅ 6 大支柱 |
| 企业级规模 | ⚠️ 250 个连接、25 个会话 | ✅ 无限制 |
可以这样理解: AegisGate MCP 是构建 MCP 服务时使用的安全基础。AegisGate Platform 是企业级网关,可保护组织内所有 AI 流量,包括 MCP、HTTP、A2A 和 ACP。
其他 AegisGate 产品:
- AegisGate Rampart — 面向使用 Claude、Cursor 或 Copilot 的开发者的免费本地代理
- AegisGate Lens — 面向日常 AI 对话的免费浏览器扩展
许可证
Apache-2.0。完整文本请参阅 LICENSE,署名信息请参阅 NOTICE。
安全
漏洞报告请参阅 SECURITY.md。
贡献
请参阅 CONTRIBUTING.md。根据 DCO,所有提交都必须签署(git commit -s)。
知识产权声明
AegisGate 的核心技术已向 USPTO 申请专利(临时申请编号 64/153,573–64/153,577,于 2026 年 9 月 12 日提交;64/174,824,于 2026 年 10 月 12 日提交;64/180,722,于 2026 年 10 月 20 日提交;以及 64/184,057,于 2026 年 10 月 26 日提交)。源代码 © 2025-2026 AegisGate Security, LLC。根据 Apache 2.0 许可证授权。
商标
AegisGate Security™ 是 AegisGate Security, LLC 的商标,已向美国专利商标局(USPTO)提交申请。该商标于 2026 年 10 月 13 日公布,进入异议期。
AegisGate MCP 是 AegisGate Security, LLC 未注册的产品名称。由于该产品名称尚未单独提交商标申请,因此不使用 ™ 符号。对“AegisGate Security”商标的使用受 Lanham Act(15 U.S.C. § 1126)及适用的州商标法管辖。
允许将 AegisGate 名称和商标用于 GitHub 上发布的、未经修改的开源软件发行版。若在衍生作品、商业产品、服务项目或营销材料中使用 AegisGate 名称、徽标或其他品牌资产,必须事先获得 AegisGate Security, LLC 的书面许可。
联系邮箱:[email protected]
🌐 AegisGate Security · 💬 Discord · ✉️ [email protected] · 𝕏 @aegisgate · 📱 Telegram · 🐘 @[email protected]
AegisGate Security 的开发者倾注 🖤 打造,旨在保护 AI 攻击面。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。