aegisgate-mcp
Marco de servidor MCP seguro con 22 capas de seguridad y detección de amenazas mediante ML. Cero dependencias.
Documentación
🛡️ AegisGate MCP
Marco de servidor MCP seguro — 22 capas de defensa, cero dependencias.
Un servidor MCP endurecido y sin dependencias escrito en Go puro. Construye tu servidor MCP sobre una base que tiene la seguridad integrada desde la primera línea, no añadida después de una brecha.
Apache 2.0 · 22 capas de seguridad · 30 patrones regex + detección ML CharCNN-BiLSTM (v13) · Cero CVEs · Cero dependencias de módulos externos
Inicio rápido · Capas de seguridad · RBAC · Arquitectura · Protocolo · Documentación · Lanzamientos
— Si AegisGate MCP te ayuda a proteger tus agentes de IA, considera ⭐ marcar este repositorio con una estrella. Ayuda a que otros lo descubran.
AegisGate Security™ es una marca comercial de AegisGate Security, LLC, registrada ante la USPTO. "AegisGate MCP" es un nombre de producto no registrado. Consulta Marca comercial a continuación.
¿Por qué AegisGate MCP?
El 38% de los servidores MCP no tienen autenticación. Más de 590 avisos de seguridad. 3 CVEs críticos en los SDK MCP oficiales en 6 meses, incluida la ejecución remota de código con CVSS 9.8 y la falla de la "madre de todas las cadenas de suministro de IA" que afecta a más de 150 millones de descargas.
Los SDK MCP oficiales te dan el protocolo. No te dan seguridad. Sin autenticación. Sin registro de auditoría. Sin detección de amenazas. Sin limitación de velocidad. Sin RBAC. Cada servidor construido sobre un SDK básico comienza con una postura de seguridad en blanco, y depende de ti construirla — u omitirla, como hace el 38% de los servidores.
AegisGate MCP es la alternativa segura. Construye tu servidor MCP sobre una base que tiene la seguridad integrada desde la primera línea, no añadida después de una brecha.
| SDK MCP oficiales | AegisGate MCP | |
|---|---|---|
| Autenticación | ❌ Trae la tuya | ✅ Tokens Bearer + claves API + bloqueo |
| Autorización | ❌ Nada | ✅ RBAC de 4 niveles con permisos por herramienta |
| Registro de auditoría | ❌ Nada | ✅ Cadena hash SHA-256 a prueba de manipulación |
| Detección de amenazas | ❌ Nada | ✅ 30 patrones regex + ML neuronal (<1 ms) |
| Riesgo de cadena de suministro | ❌ Dependencias npm/PyPI | ✅ Cero dependencias (solo biblioteca estándar de Go) |
| CVEs | 3 críticos en 6 meses | Cero. Siempre. |
| Licencia | MIT | Apache 2.0 |
22 capas de seguridad. Cero dependencias. Cero CVEs. Apache 2.0.
¿Necesitas modo proxy, OAuth, SIEM o marcos de cumplimiento? Consulta Cuándo actualizar a AegisGate Platform a continuación — o explora AegisGate Rampart para protección de proxy de API de IA local.
Descripción general
AegisGate MCP es un servidor MCP endurecido y sin dependencias escrito en Go puro. Se sitúa entre los agentes de IA y las herramientas que llaman, aplicando 22 capas de defensa a cada solicitud, desde autenticación y RBAC hasta detección neuronal de amenazas y análisis de cadenas.
Los servidores MCP estándar asumen un entorno local de confianza. En producción — ya sea una plataforma SaaS en la nube, una canalización de datos empresarial o una red de planta aislada — los agentes pueden ejecutar comandos, consultar bases de datos o interactuar con sistemas críticos. Una sola llamada a herramienta no autorizada o maliciosa puede causar exfiltración de datos, interrupción de procesos o algo peor. AegisGate MCP envuelve cada llamada a herramienta en defensa en profundidad, todo con cero dependencias de módulos externos para que pueda ejecutarse en entornos aislados.
| Versión | 1.4.2 |
| Licencia | Apache-2.0 |
| Versión de Go | 1.26+ |
| Dependencias de módulos | Cero (sin directivas require — todo el código de terceros está incluido) |
| Imagen Docker | debian:bookworm-slim, ~135 MB (con ML) o ~8 MB (solo heurístico) |
| Arquitecturas | amd64, arm64 |
| Modelo ML | CharCNN-BiLSTM v13, 1.6 M de parámetros, inferencia de CPU <1 ms |
| Pruebas | 429 pruebas, 10 puntos de referencia, 3 objetivos de fuzzing, 90.8 % de cobertura (sin CGO) / 91.4 % (con CGO) |
Inicio rápido
Compilación
go build -o mcp-server ./cmd/mcp-server
Ejecución
# 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, ~135 MB)
docker build -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
# Heuristic-only build (no CGO, ~8 MB)
docker build --build-arg CGO_ENABLED=0 -t aegisgate-mcp:lite .
docker run -p 8081:8081 aegisgate-mcp:lite --demo
La imagen Docker predeterminada usa debian:bookworm-slim con CGO habilitado,
incluido el ONNX Runtime incluido y el modelo CharCNN-BiLSTM v13 para
detección neuronal completa de amenazas. Una variante --build-arg CGO_ENABLED=0
produce una imagen más pequeña solo heurística. Las compilaciones multiarquitectura
admiten tanto linux/amd64 como linux/arm64.
Detección de amenazas ML (L3)
AegisGate MCP incluye el mismo modelo neuronal CharCNN-BiLSTM v13 utilizado por AegisGate Platform y Rampart — incluido con cero dependencias de módulos externos. El modelo proporciona:
- Detección semántica de ataques — detecta intentos de inyección de prompts y evasión de jailbreak que eluden la coincidencia de patrones regex
- Resistencia a la evasión — detecta técnicas de ofuscación (leet speak, homoglifos Unicode, transposición de caracteres, eliminación de vocales, inversión de palabras)
- Bloqueo de dos niveles — puntuaciones ≥0.95 bloquean de forma independiente; las puntuaciones 0.50–0.94 bloquean solo si hay corroboración de L1 (regex) o L2 (escáner de entrada)
- Modo sombra — registra predicciones sin bloquear (para calibración)
- Respaldo heurístico — cuando CGO no está disponible, la puntuación heurística proporciona detección de referencia sin ONNX
| Indicador | Variable de entorno | Predeterminado | Descripción |
|---|---|---|---|
--ml | MCP_ML_ENABLED | false (CLI) / true (Docker) | Habilitar detección neuronal de amenazas |
--ml-shadow | MCP_ML_SHADOW | false | Registrar predicciones pero nunca bloquear |
--ml-threshold | MCP_ML_THRESHOLD | 0.50 | Umbral de puntuación de amenaza (0.0–1.0) |
--ml-model | MCP_ML_MODEL | ./models/threat_cnn_bilstm.onnx | Ruta al archivo del modelo ONNX |
Uso como biblioteca
AegisGate MCP se puede integrar como biblioteca de 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()
}
Consulta examples/simple-server/ para ver un ejemplo completo y funcional que registra una herramienta, un recurso y un prompt.
Intercambio en caliente del modelo ML
Recarga el modelo neuronal de detección de amenazas en tiempo de ejecución sin reiniciar el servidor:
// 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)
}
Detección de envenenamiento de herramientas
Todas las herramientas registradas mediante RegisterTool() se escanean automáticamente
para detectar inyección de prompts en sus descripciones y inputSchema. Para escanear manualmente:
err := server.ScanToolForPoisoning("my_tool", description, inputSchema)
if err != nil {
// err is *ToolPoisoningError — do not register this tool
}
Capas de seguridad
AegisGate MCP aplica 22 capas de seguridad a cada solicitud, en orden:
| # | Capa | Descripción | Fuente |
|---|---|---|---|
| 1 | Autenticación | Token Bearer + clave API, comparación en tiempo constante, bloqueo automático ante fallos repetidos | auth.go |
| 2 | Verificación de firma | ECDSA P-256 antifalsificación — verifica firmas de mensajes contra claves públicas de confianza | auth.go |
| 3 | Gestión de sesiones | IDs de sesión aleatorios criptográficos de 256 bits, caducidad, comprobaciones antihijacking | session.go |
| 4 | RBAC | Jerarquía de roles de 4 niveles (restringido → estándar → privilegiado → administrador), permisos por herramienta | rbac.go |
| 5 | Motor de políticas | Reglas de permitir/denegar con condiciones, prioridades, ventanas de tiempo y patrones de parámetros | policy.go |
| 6 | Protecciones | Límites de llamadas a herramientas por sesión y limitación de velocidad | guardrails.go |
| 7 | Análisis de cadenas | Detecta escalada de privilegios, cadenas de exfiltración de datos y llamadas repetidas a herramientas peligrosas | guardrails.go |
| 8 | Limitación de velocidad con token bucket | Limitación de velocidad de ventana deslizante con algoritmo de token bucket (RPM + capacidad de ráfaga) | guardrails.go |
| 9 | Escaneo de entrada | Escanea los parámetros de las herramientas para detectar inyección de prompts antes de la ejecución (~30 patrones) | handler.go, scanner.go |
| 10 | Escaneo de respuestas | Escanea las respuestas de las herramientas para detectar PII, secretos, XSS e inyección de prompts (~30 patrones de detección) | scanner.go |
| 11 | Redacción de secretos | Depura datos sensibles (PII, secretos) de las respuestas antes de devolverlas al cliente | scanner.go |
| 12 | Tiempo de espera de ejecución de herramientas | Tiempo de espera configurable por llamada evita herramientas colgadas o descontroladas | handler.go |
| 13 | Validación STDIO | Prevención de inyección de shell mediante lista de permitidos + lista de bloqueados para comandos de transporte stdio | stdio_guard.go |
| 14 | Registro de auditoría | Todas las acciones MCP se registran en archivo + memoria, consultables para cumplimiento, cadena hash a prueba de manipulación | audit.go |
| 15 | Transporte TLS / mTLS | Conexiones TCP cifradas con TLS mutuo opcional | config.go, server.go |
| 16 | Transporte stdio | Transporte estándar de cliente MCP para Claude Desktop, Cursor y otras integraciones locales | transport.go |
| 17 | Punto final de salud | Puntos finales HTTP /healthz, /readyz, /stats en un listener separado | transport.go |
| 18 | Validación de parámetros | Los campos obligatorios se verifican contra el inputSchema de cada herramienta antes de la ejecución | handler.go |
| 19 | Detección neuronal de amenazas (L3) | El modelo CharCNN-BiLSTM v13 puntúa ataques semánticos y variantes de evasión que el regex no detecta. Bloqueo de dos niveles: ≥0.95 bloquea de forma independiente, 0.50–0.94 requiere corroboración L1/L2 | internal/ml/ |
| 20 | Detección heurística de evasión | Detecta transposición, eliminación de vocales, inversión de palabras, leet speak, codificación, división y ofuscación con caracteres de ancho cero | internal/ml/evasion_resistance.go |
| 21 | Normalización Unicode NFKC | Asigna caracteres de compatibilidad Unicode a formas canónicas antes del escaneo — frustra ataques de homoglifos y ligaduras (Ignore de ancho completo → ignore) | internal/ml/normalizer.go |
| 22 | Detección de envenenamiento de herramientas | Escanea descripciones de herramientas y inputSchema de forma recursiva para detectar inyección de prompts en el momento del registro — rechaza herramientas envenenadas antes de que puedan llamarse. Se asigna a OWASP MCP Top 10 M1 | handler.go |
⚙️ Configuración
Prioridad de configuración
La configuración se resuelve en orden de mayor a menor prioridad:
- Indicadores CLI — anulan todo
- Variables de entorno — anulan el archivo de configuración
- Archivo de configuración JSON (
--config) — anula los valores predeterminados integrados - Valores predeterminados integrados
Indicadores CLI
Todos los indicadores CLI tienen equivalentes de variables de entorno:
| Flag | Env Var | Valor por defecto | Descripción |
|---|---|---|---|
--addr | MCP_SERVER_ADDR | :8081 | Dirección de escucha (modo TCP) |
--transport | MCP_TRANSPORT | tcp | Modo de transporte: tcp, stdio o http (HTTP Streamable) |
--token | MCP_AUTH_TOKEN | (vacío) | Token Bearer para autenticación |
--audit | MCP_AUDIT_LOG | (vacío) | Ruta del archivo de registro de auditoría |
--max-sessions | MCP_MAX_SESSIONS | 50 | Máximo de sesiones concurrentes |
--max-connections | MCP_MAX_CONNECTIONS | 1000 | Máximo de conexiones TCP concurrentes (-1 = ilimitado) |
--rate-limit | MCP_RATE_LIMIT_RPM | 60 | Límite de tasa (solicitudes/min) |
--exec-timeout | MCP_EXEC_TIMEOUT | 30 | Tiempo de espera de ejecución de herramientas (segundos) |
--scan-responses | MCP_SCAN_RESPONSES | true | Habilitar escaneo de respuestas |
--block-pii | MCP_BLOCK_PII | true | Bloquear respuestas que contengan PII |
--block-secrets | MCP_BLOCK_SECRETS | true | Bloquear respuestas que contengan secretos |
--block-xss | MCP_BLOCK_XSS | true | Bloquear respuestas que contengan XSS |
--block-prompt-inject | MCP_BLOCK_PROMPT_INJECT | true | Bloquear respuestas que contengan inyección de prompts |
--redact | MCP_REDACT_ENABLED | false | Habilitar redacción de secretos/PII |
--redact-pii | MCP_REDACT_PII | false | Redactar PII de las respuestas |
--redact-secrets | MCP_REDACT_SECRETS | true | Redactar secretos de las respuestas |
--redact-placeholder | MCP_REDACT_PLACEHOLDER | [REDACTED] | Texto de marcador de redacción |
--tls | MCP_TLS_ENABLED | false | Habilitar transporte TLS |
--tls-cert | MCP_TLS_CERT | (vacío) | Archivo de certificado del servidor (PEM) |
--tls-key | MCP_TLS_KEY | (vacío) | Archivo de clave privada del servidor (PEM) |
--tls-client-ca | MCP_TLS_CLIENT_CA | (vacío) | Paquete CA para certificados de cliente (habilita mTLS) |
--tls-min-version | MCP_TLS_MIN_VERSION | 1.2 | Versión mínima de TLS: 1.2 o 1.3 |
--health-addr | MCP_HEALTH_ADDR | (vacío) | Dirección de escucha del endpoint de salud (vacío = deshabilitado) |
--config | MCP_CONFIG_FILE | (vacío) | Ruta del archivo de configuración JSON |
--demo | MCP_DEMO_TOOLS | false | Registrar herramientas de demostración (ping, system_info, echo) |
--ml | MCP_ML_ENABLED | false | Habilitar detección neuronal de amenazas (L3, requiere compilación CGO) |
--ml-shadow | MCP_ML_SHADOW | false | Modo sombra ML: registrar predicciones pero nunca bloquear |
--ml-threshold | MCP_ML_THRESHOLD | 0.50 | Umbral de puntuación de amenaza ML (0.0–1.0) |
--ml-model | MCP_ML_MODEL | ./models/threat_cnn_bilstm.onnx | Ruta al archivo del modelo ONNX |
Archivo de Configuración 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
}
Modos de Transporte
| Modo | Flag | Descripción |
|---|---|---|
tcp | --transport tcp (predeterminado) | Listener TCP, soporta cifrado TLS/mTLS para despliegues de red |
stdio | --transport stdio | Transporte estándar MCP stdin/stdout para clientes locales (Claude Desktop, Cursor) |
http | --transport http | HTTP Streamable (MCP 2025-06-18) — POST JSON-RPC al endpoint /mcp, con gestión de sesiones Mcp-Session-Id, streaming SSE mediante el encabezado Accept, DELETE para terminación de sesión, soporta proxies inversos con terminación TLS |
Endpoints de Salud
Cuando --health-addr está configurado, un listener HTTP separado proporciona endpoints de observabilidad:
| Endpoint | Método | Descripción |
|---|---|---|
/healthz | GET | Sonda de actividad — devuelve 200 OK si el proceso del servidor está en ejecución |
/readyz | GET | Sonda de preparación — devuelve 200 OK si el servidor está listo para aceptar solicitudes |
/stats | GET | Estadísticas del servidor como JSON (sesiones, límites de tasa, llamadas a herramientas, active_connections, max_connections) |
🔐 RBAC y Motor de Políticas
Roles RBAC
AegisGate MCP aplica una jerarquía de roles de 4 niveles. Los roles están ordenados: restricted < standard < privileged < admin.
| Rol | Nivel | Acceso | Herramientas de Ejemplo |
|---|---|---|---|
restricted | 0 | Solo herramientas de solo lectura | ping, system_info, file_exists, git_status, git_log |
standard | 1 | Lectura + escritura de bajo riesgo | file_read, code_search, web_search, file_copy |
privileged | 2 | Todo excepto ejecución de alto riesgo | Todas las herramientas excepto shell_command, code_execute |
admin | 3 | Todas las herramientas, sin restricciones | Todas las herramientas registradas |
La comparación de roles utiliza AgentRole.AtLeast() — un agente privileged puede acceder a cualquier herramienta que requiera standard o restricted, pero no a herramientas que requieran admin.
Motor de Políticas
El Motor de Políticas evalúa reglas de permitir/denegar antes de que se ejecute cualquier herramienta. Las reglas soportan:
- Coincidencia de nombres de herramientas — nombres exactos y patrones comodín
- Condiciones de rol de agente — aplicar reglas solo a roles específicos
- Umbrales de puntuación de riesgo — activar en valores de
RiskAbove - Prioridades — las reglas de mayor prioridad se evalúan primero
- Ventanas de tiempo — restringir herramientas a rangos de tiempo específicos
- Patrones de parámetros — coincidir con parámetros de llamadas a herramientas
- Acciones — permitir, denegar (con motivo), nivel de registro, modificadores de riesgo
Reglas de Política Integradas
Cargadas mediante LoadDefaultPolicies():
| ID de Regla | Prioridad | Acción | Condición | Descripción |
|---|---|---|---|---|
block-shell-commands | 100 | Denegar | Nombres de herramientas: shell_command, bash, exec, cmd, terminal; Roles: restringido, estándar, privilegiado | Los comandos de shell requieren rol de administrador |
block-file-delete | 90 | Denegar | Nombres de herramientas: file_delete, rm, unlink, remove; Roles: restringido, estándar | La eliminación de archivos requiere rol privilegiado o administrador |
block-network-write | 80 | Denegar | Nombres de herramientas: http_request, web_search, fetch_url, curl, wget; Roles: restringido | Operaciones de red no permitidas para agentes restringidos |
alert-high-risk | 50 | Permitir + Alerta | Puntuación de riesgo > 70 | Marca operaciones de alto riesgo para registro de auditoría |
Se pueden agregar reglas personalizadas programáticamente:
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,
})
Análisis de Cadena
El Analizador de Cadenas rastrea secuencias de llamadas a herramientas dentro de una sesión (ventana móvil de 20 llamadas) y marca patrones sospechosos:
| Detección | Flag | Disparador |
|---|---|---|
| Escalada de Privilegios | privilege_escalation | Llamada a herramienta de bajo riesgo seguida de una de alto riesgo (shell_command, file_delete, db_query) |
| Exfiltración de Datos | data_exfiltration_chain | Lectura de datos sensibles (file_read, db_query, code_search) seguida de una escritura externa (http_request, file_write, web_search) |
| Herramientas Peligrosas Repetidas | repeated_dangerous_tools | 3+ llamadas a herramientas de alto riesgo dentro de la ventana de análisis |
Cuando se levanta cualquier flag, el riesgo de la cadena se establece en Alto y el evento se registra en el nivel WARN con el ID de sesión, flags y recuento de llamadas.
✍️ Verificación de Firmas
AegisGate MCP soporta firma de mensajes ECDSA P-256 para prevenir falsificación y manipulación de solicitudes.
Los clientes firman el JSON canónico de cada solicitud (con los campos Signature y KeyID puestos a cero)
e incluyen la firma en el encabezado de la solicitud.
Configuración del Servidor
server, _ := mcp.NewSecuredMCPServer(cfg)
// Register a trusted client public key (SEC1 encoded)
server.AddTrustedKey("agent-001", clientPubKeySEC1)
Firma del Cliente (ejemplo)
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)
}
El servidor verifica la firma usando ecdsa.VerifyASN1 contra la clave pública de confianza.
Si no hay KeyID o Signature presente, la verificación se omite — permitiendo interoperabilidad
con clientes sin firma mientras se aplican firmas para clientes que las proporcionan.
🧪 Pruebas y Rendimiento
Cobertura de Pruebas
| Categoría | Pruebas | Cobertura |
|---|---|---|
| Unitarias + integración (no CGO) | 425 | 90.8% |
| Unitarias + integración (CGO + ML) | 429 | 91.4% |
Carga / ruptura / remojo (etiqueta de compilación: load) | 9 | — |
| Benchmarks | 10 | — |
| Objetivos de fuzzing | 3 | — |
Ejecución de Pruebas
# 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 180s ./...
# Load/break/soak tests (behind build tag)
go test -tags=load -count=1 -timeout 120s -v ./...
# Benchmarks (regression tracking)
go test -bench=. -benchmem -benchtime=5s ./...
# Fuzz testing (run for 60 seconds per target)
go test -fuzz=FuzzHandleRequest -fuzztime=60s ./...
Características de Rendimiento
Validadas mediante el conjunto de pruebas de carga (//go:build load):
| Métrica | Valor | Prueba |
|---|---|---|
| Rendimiento sostenido | 14,427 req/seg | TestLoadSustainedThroughput |
| Latencia p50 (100 concurrentes) | 34 ms | TestLoadConcurrentConnections |
| Latencia p99 (100 concurrentes) | 46 ms | TestLoadConcurrentConnections |
| Tasa de rotación de conexiones | 2,662 conn/seg | TestConnectionChurn |
| Fugas de goroutines (remojo 10s) | 0 | TestSoakStability |
| Apagado elegante bajo carga | 1.6 ms | TestShutdownUnderLoad |
📦 Cero Dependencias de Módulos
AegisGate MCP tiene cero dependencias de módulos externos. El archivo go.mod contiene
sin directivas require. Todo el código de terceros (enlaces ONNX Runtime, normalización
Unicode, modelo ML) está incluido en internal/, lib/ y 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.
Componentes incluidos (ver NOTICE para atribución completa):
| Componente | Licencia | Ubicación |
|---|---|---|
| onnxruntime_go (enlaces Go) | MIT | internal/onnxruntime_go/ |
| libonnxruntime.so (Microsoft) | MIT | lib/amd64/, lib/arm64/ |
| golang.org/x/text (norma Unicode) | BSD-3-Clause | internal/textnorm/ |
| Modelo CharCNN-BiLSTM v13 | Apache-2.0 | models/ |
Por qué esto importa:
- Despliegue aislado — no se necesita
go mod download, sin riesgo de cadena de suministro - Sin dependencias transitivas — nada que auditar más allá del código incluido
- Compilaciones reproducibles — el binario es idéntico entre compilaciones
- Superficie de ataque mínima — todo el código de terceros es visible y auditable
- Compilación rápida — sin sobrecarga de resolución de dependencias
🏗️ Arquitectura y Protocolo
Arquitectura
┌─────────────────────────────────────────────────────────────────────────┐
│ 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) │
└─────────────────────────────────────────────────────────────────────────┘
Flujo de solicitudes:
- Cliente TCP se conecta (opcionalmente sobre TLS/mTLS) o stdio envía JSON-RPC mediante stdin
- Middleware de Autenticación valida token bearer/clave API (tiempo constante), verifica firma ECDSA, crea/valida sesión
- Guardarraíles aplican límites de tasa, límites de sesión y ejecutan análisis de cadena
- Escaneo de Respuesta (la validación de parámetros previa a la ejecución ocurre en el handler)
- Manejador de Solicitudes verifica permisos RBAC, evalúa reglas del Motor de Políticas, valida parámetros requeridos contra
inputSchema, ejecuta herramienta con tiempo de espera - Escaneo de Respuesta (post-ejecución) escanea la salida de la herramienta en busca de PII, secretos, XSS, inyección de prompts; redacta si está habilitado
- Registro de Auditoría registra la cadena de acciones completa
Soporte de Protocolo MCP
AegisGate MCP implementa los siguientes métodos JSON-RPC (Protocolo MCP 2025-06-18):
| Método | Tipo | Descripción |
|---|---|---|
initialize | Solicitud | Analiza clientInfo, devuelve serverInfo + capacidades (herramientas, recursos, prompts, registro) |
notifications/initialized | Notificación | Se maneja silenciosamente — no se envía respuesta (según la especificación MCP) |
notifications/cancelled | Notificación | Cancelación iniciada por el cliente — se registra, no se envía respuesta |
notifications/tools/list_changed | Iniciada por el servidor | Se envía cuando se agregan o eliminan herramientas |
notifications/resources/list_changed | Iniciada por el servidor | Se envía cuando se agregan o eliminan recursos |
notifications/resources/updated | Iniciada por el servidor | Se envía cuando cambia el contenido de un recurso suscrito |
notifications/prompts/list_changed | Iniciada por el servidor | Se envía cuando se agregan o eliminan prompts |
tools/list | Solicitud | Devuelve las herramientas registradas con descripciones y inputSchema. Admite paginación basada en cursor |
tools/call | Solicitud | Ejecuta una herramienta después de pasar todas las capas de seguridad |
resources/list | Solicitud | Devuelve los recursos registrados (URIs, nombres, descripciones). Admite paginación basada en cursor |
resources/read | Solicitud | Lee un recurso por URI — llama al ResourceHandlerFunc registrado |
resources/templates/list | Solicitud | Devuelve las plantillas de URI registradas para recursos parametrizados |
resources/subscribe | Solicitud | Suscribe la sesión a notificaciones de actualización de recursos para una URI |
resources/unsubscribe | Solicitud | Elimina una suscripción de recurso |
prompts/list | Solicitud | Devuelve los prompts registrados (nombres, descripciones, argumentos). Admite paginación basada en cursor |
prompts/get | Solicitud | Obtiene un prompt por nombre con argumentos opcionales — llama al PromptHandlerFunc registrado |
ping | Solicitud | Verificación de salud — devuelve una respuesta de éxito vacía |
Gestión de sesiones HTTP transmisible (v1.2.2+):
POST /mcpconinitialize→ la respuesta incluye el encabezadoMcp-Session-IdPOST /mcpcon solicitudes posteriores → debe incluir el encabezadoMcp-Session-IdDELETE /mcpcon el encabezadoMcp-Session-Id→ finaliza la sesión (204 Sin Contenido)- Las sesiones expiran después de 30 minutos de inactividad
🏭 Casos de Uso y Escenarios de Despliegue
AegisGate MCP sirve en cualquier entorno donde los agentes de IA interactúan con herramientas — desde plataformas SaaS en la nube hasta pipelines de datos empresariales y redes de plantas OT/ICS. Las mismas 21 capas de seguridad se aplican independientemente del contexto de despliegue.
Despliegues Generales
- SaaS en la nube — protege las funciones de IA orientadas al usuario contra inyección de prompts y exfiltración de datos
- Acceso a datos empresariales — aplica RBAC y registro de auditoría en consultas de bases de datos impulsadas por agentes
- Automatización CI/CD — restringe lo que los pipelines asistidos por IA pueden ejecutar
- Redes aisladas — cero dependencias significa que el servidor se ejecuta sin acceso a internet
Entornos OT/ICS
En un entorno OT/ICS, AegisGate MCP se sitúa entre los agentes de IA y las herramientas de infraestructura crítica:
AI Agent (Claude, Cursor, custom)
│
▼
┌──────────────────┐
│ AegisGate MCP │ ← 22 security layers
│ (TLS/mTLS) │
└────────┬─────────┘
│
┌────┼────┬────┬────┐
▼ ▼ ▼ ▼ ▼
SCADA PLC Hist Tag Log
Read Status Query DB Analyzer
Escenarios de despliegue típicos:
- Agente de monitoreo de solo lectura — rol
restricted, puede consultar el estado de SCADA y datos del historial pero no puede emitir comandos - Agente de mantenimiento — rol
standard, puede leer archivos y buscar código durante la resolución de problemas - Agente de operaciones — rol
privileged, puede interactuar con la mayoría de las herramientas pero no puede ejecutar comandos de shell - Agente administrador — rol
admin, acceso completo para ventanas de mantenimiento autorizadas
Características de seguridad particularmente relevantes para OT/ICS:
- TLS/mTLS cifra todo el tráfico en la red de la planta
- Políticas de ventana de tiempo restringen herramientas de alto riesgo a ventanas de mantenimiento
- Análisis de cadena detecta si un agente lee datos de procesos sensibles y luego intenta una escritura de red externa (exfiltración)
- Registro de auditoría proporciona una cadena completa de custodia para cumplimiento (NERC CIP, IEC 62443)
- Operación aislada — cero dependencias significa que el servidor puede desplegarse en redes aisladas sin acceso a internet
Herramientas de Demostración
Habilite las herramientas de demostración con la bandera --demo o llamando a RegisterDemoTools() en modo biblioteca.
Estas son herramientas seguras de solo lectura que no acceden al sistema de archivos, la red ni ningún recurso externo.
| Herramienta | Nivel de Riesgo | Parámetros Requeridos | Descripción |
|---|---|---|---|
ping | 10 | (ninguno) | Devuelve "pong" — herramienta de verificación de salud |
system_info | 30 | (ninguno) | Devuelve versión de Go, SO, arquitectura, número de CPU, número de goroutines, marca de tiempo |
echo | 20 | message (cadena) | Devuelve el mensaje proporcionado |
Ejemplo — respuesta de system_info:
{
"go_version": "go1.26.9",
"os": "linux",
"arch": "amd64",
"cpus": 8,
"goroutines": 12,
"timestamp": "2026-10-08T08:58:00Z"
}
Documentación
La documentación detallada está disponible en el directorio docs/:
| Documento | Descripción |
|---|---|
docs/getting-started.md | Instalación, primera ejecución y configuración básica |
docs/deployment-guide.md | Despliegue en producción: Docker, TLS, configuraciones aisladas |
docs/admin-guide.md | Administración: sesiones, registros de auditoría, gestión de RBAC, políticas |
docs/how-to-guides.md | Guías específicas de tareas: herramientas personalizadas, verificación de firmas, configuración de mTLS |
docs/building-your-first-server.md | Tutorial: construya un servidor MCP seguro completo desde cero con herramientas personalizadas, RBAC y políticas |
docs/integrating-with-cursor.md | Conecte Cursor a AegisGate MCP mediante transporte HTTP transmisible |
docs/model-card.md | Detalles del modelo de ML: arquitectura, datos de entrenamiento, métricas de rendimiento |
docs/comparison.md | Comparación de características: AegisGate MCP vs SDKs MCP oficiales y envoltorios complementarios |
docs/owasp-mcp-top-10.md | Mapeo de riesgos OWASP MCP Top 10 — cobertura para los 10 riesgos de seguridad |
docs/v1.3.0-roadmap.md | Hoja de ruta para transmisión SSE, notificaciones iniciadas por el servidor, suscripciones de recursos y plantillas de recursos (P1–P4 completos) |
Registro de Cambios
Consulte CHANGELOG.md para el historial de versiones y cambios notables.
Cuándo Actualizar a la Plataforma AegisGate
AegisGate MCP es un marco de servidor MCP seguro independiente — perfecto para construir y ejecutar servidores MCP con seguridad integrada. Es gratuito, de código abierto y tiene cero dependencias externas.
Cuando sus necesidades crezcan más allá de un solo servidor, Plataforma AegisGate es la ruta de actualización natural:
| Necesidad | AegisGate MCP (gratuito) | Plataforma AegisGate |
|---|---|---|
| Marco de servidor MCP seguro | ✅ 22 capas, cero dependencias | ✅ Servidor MCP integrado |
| Detección de amenazas ML | ✅ Limitado a 100 inf/min (servidor único) | ✅ Ilimitado, a nivel organizacional |
| Modo proxy/puerta de enlace | ❌ Marco, no proxy | ✅ Se sitúa entre clientes y todos los servicios de IA |
| OAuth 2.0 / OIDC / SSO | ❌ Tokens Bearer + claves API | ✅ SAML, OIDC, JWT |
| Integración SIEM | ❌ Auditoría basada en archivos + Prometheus | ✅ Splunk, Elasticsearch, QRadar, Datadog (11 plataformas) |
| Marcos de cumplimiento | ❌ Ninguno | ✅ 31 marcos (HIPAA, PCI, SOC 2, Ley de IA de la UE, NIST, etc.) |
| Multiprotocolo (HTTP, A2A, ACP) | ❌ Solo MCP | ✅ 6 pilares |
| Escala empresarial | ⚠️ 250 conexiones, 25 sesiones | ✅ Ilimitado |
Piénselo de esta manera: AegisGate MCP es la base segura sobre la que construye servidores MCP. La Plataforma AegisGate es la puerta de enlace empresarial que asegura todo el tráfico de IA en su organización — incluidos MCP, HTTP, A2A y ACP.
Otros productos AegisGate:
- AegisGate Rampart — Proxy local gratuito para desarrolladores que usan Claude, Cursor o Copilot
- AegisGate Lens — Extensión de navegador gratuita para conversaciones cotidianas de IA
Licencia
Apache-2.0. Consulte LICENSE para el texto completo y NOTICE para atribución.
Seguridad
Consulte SECURITY.md para informar vulnerabilidades.
Contribuciones
Consulte CONTRIBUTING.md. Todas las confirmaciones deben estar firmadas (git commit -s) según el DCO.
Aviso de Propiedad Intelectual
Las tecnologías principales de AegisGate tienen patente pendiente ante la USPTO (Solicitudes Provisionales N.º 64/153,573–64/153,577, presentadas el 12 de septiembre de 2026). El código fuente es © 2025-2026 AegisGate Security, LLC. Licenciado bajo Apache 2.0.
Marca Comercial
AegisGate Security™ es una marca comercial de AegisGate Security, LLC, registrada ante la Oficina de Patentes y Marcas de los Estados Unidos (USPTO). La marca se publicó para oposición el 13 de octubre de 2026.
AegisGate MCP es un nombre de producto no registrado de AegisGate Security, LLC. El símbolo ™ no se utiliza para este nombre de producto, ya que no se ha presentado por separado como solicitud de marca comercial. El uso de la marca "AegisGate Security" se rige por la Ley Lanham (15 U.S.C. § 1126) y la ley de marcas comerciales estatal aplicable.
Se concede permiso para usar el nombre y las marcas de AegisGate en relación con la distribución de software de código abierto sin modificar publicada en GitHub. El uso del nombre, logotipo u otros activos de marca de AegisGate en obras derivadas, productos comerciales, ofertas de servicios o materiales de marketing requiere permiso escrito previo de AegisGate Security, LLC.
Contacto: legal@aegisgatesecurity.io
🌐 AegisGate Security · 💬 Discord · ✉️ support@aegisgatesecurity.io · 𝕏 @aegisgate · 📱 Telegram · 🐘 @aegisgate@mastodon.social
Hecho con 🖤 por los desarrolladores de AegisGate Security para asegurar la superficie de ataque de la IA.