aegisgate-mcp
Framework de servidor MCP seguro com 22 camadas de segurança e detecção de ameaças por ML. Zero dependências.
Documentação
🛡️ AegisGate MCP
Framework de servidor MCP seguro — 22 camadas de defesa, zero dependências.
Um servidor MCP endurecido e sem dependências, escrito em Go puro. Construa seu servidor MCP sobre uma fundação que tem segurança embutida desde a primeira linha — não adicionada depois de uma violação.
Apache 2.0 · 22 camadas de segurança · 30 padrões regex + detecção ML CharCNN-BiLSTM (v13) · Zero CVEs · Zero dependências de módulos externos
Início Rápido · Camadas de Segurança · RBAC · Arquitetura · Protocolo · Documentação · Versões
— Se o AegisGate MCP ajuda você a proteger seus agentes de IA, considere ⭐ dar uma estrela neste repositório. Isso ajuda outras pessoas a descobri-lo.
AegisGate Security™ é uma marca registrada da AegisGate Security, LLC, registrada no USPTO. "AegisGate MCP" é um nome de produto não registrado. Consulte Marca Registrada abaixo.
Por que AegisGate MCP?
38% dos servidores MCP não têm autenticação. Mais de 590 avisos de segurança. 3 CVEs críticos nos SDKs MCP oficiais em 6 meses — incluindo execução remota de código com CVSS 9.8 e a falha da "Mãe de Todas as Cadeias de Suprimentos de IA" afetando mais de 150 milhões de downloads.
Os SDKs MCP oficiais fornecem o protocolo. Eles não fornecem segurança. Sem autenticação. Sem registro de auditoria. Sem detecção de ameaças. Sem limitação de taxa. Sem RBAC. Todo servidor construído em um SDK básico começa com uma postura de segurança em branco e cabe a você construí-la — ou ignorá-la, como fazem 38% dos servidores.
AegisGate MCP é a alternativa segura. Construa seu servidor MCP sobre uma fundação que tem segurança embutida desde a primeira linha — não adicionada depois de uma violação.
| SDKs MCP oficiais | AegisGate MCP | |
|---|---|---|
| Autenticação | ❌ Traga a sua | ✅ Tokens Bearer + chaves de API + bloqueio |
| Autorização | ❌ Nada | ✅ RBAC de 4 níveis com permissões por ferramenta |
| Registro de auditoria | ❌ Nada | ✅ Cadeia de hash SHA-256 à prova de adulteração |
| Detecção de ameaças | ❌ Nada | ✅ 30 padrões regex + ML neural (<1ms) |
| Risco na cadeia de suprimentos | ❌ Dependências npm/PyPI | ✅ Zero dependências (somente stdlib Go) |
| CVEs | 3 críticos em 6 meses | Zero. Sempre. |
| Licença | MIT | Apache 2.0 |
22 camadas de segurança. Zero dependências. Zero CVEs. Apache 2.0.
Precisa de modo proxy, OAuth, SIEM ou frameworks de conformidade? Consulte Quando atualizar para a Plataforma AegisGate abaixo — ou explore AegisGate Rampart para proteção de proxy de API de IA local.
Visão Geral
AegisGate MCP é um servidor MCP endurecido e sem dependências, escrito em Go puro. Ele fica entre os agentes de IA e as ferramentas que eles chamam, aplicando 22 camadas de defesa a cada requisição — desde autenticação e RBAC até detecção neural de ameaças e análise de cadeia.
Servidores MCP padrão assumem um ambiente local confiável. Em produção — seja uma plataforma SaaS na nuvem, um pipeline de dados empresarial ou uma rede de planta isolada (air-gapped) — os agentes podem executar comandos, consultar bancos de dados ou interagir com sistemas críticos. Uma única chamada de ferramenta não autorizada ou maliciosa pode causar exfiltração de dados, interrupção de processos ou pior. AegisGate MCP envolve cada chamada de ferramenta em defesa em profundidade, tudo com zero dependências de módulos externos para que possa operar em ambientes isolados.
| Versão | 1.4.2 |
| Licença | Apache-2.0 |
| Versão do Go | 1.26+ |
| Dependências de módulos | Zero (sem diretivas require — todo código de terceiros é fornecido internamente) |
| Imagem Docker | debian:bookworm-slim, ~135 MB (com ML) ou ~8 MB (somente heurística) |
| Arquiteturas | amd64, arm64 |
| Modelo ML | CharCNN-BiLSTM v13, 1,6M parâmetros, inferência em CPU <1ms |
| Testes | 429 testes, 10 benchmarks, 3 alvos de fuzzing, 90,8% de cobertura (sem CGO) / 91,4% (com CGO) |
Início Rápido
Build
go build -o mcp-server ./cmd/mcp-server
Executar
# 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
A imagem Docker padrão usa debian:bookworm-slim com CGO habilitado,
incluindo o ONNX Runtime fornecido internamente e o modelo CharCNN-BiLSTM v13 para
detecção neural completa de ameaças. Uma variante --build-arg CGO_ENABLED=0
produz uma imagem menor somente com heurísticas. Builds multi-arquitetura suportam
tanto linux/amd64 quanto linux/arm64.
Detecção Neural de Ameaças (L3)
AegisGate MCP inclui o mesmo modelo neural CharCNN-BiLSTM v13 usado pela Plataforma AegisGate e pelo Rampart — fornecido internamente com zero dependências de módulos externos. O modelo fornece:
- Detecção semântica de ataques — detecta tentativas de injeção de prompt e jailbreak que contornam a correspondência de padrões regex
- Resistência a evasão — detecta técnicas de ofuscação (leet speak, homóglifos Unicode, transposição de caracteres, remoção de vogais, inversão de palavras)
- Bloqueio em dois níveis — pontuações ≥0,95 bloqueiam de forma independente; pontuações 0,50–0,94 bloqueiam somente se houver corroboração de L1 (regex) ou L2 (scanner de entrada)
- Modo sombra — registra previsões sem bloquear (para calibração)
- Fallback heurístico — quando CGO não está disponível, a pontuação heurística fornece detecção de linha de base sem ONNX
| Flag | Variável de Ambiente | Padrão | Descrição |
|---|---|---|---|
--ml | MCP_ML_ENABLED | false (CLI) / true (Docker) | Habilita detecção neural de ameaças |
--ml-shadow | MCP_ML_SHADOW | false | Registra previsões mas nunca bloqueia |
--ml-threshold | MCP_ML_THRESHOLD | 0.50 | Limiar de pontuação de ameaça (0,0–1,0) |
--ml-model | MCP_ML_MODEL | ./models/threat_cnn_bilstm.onnx | Caminho para o arquivo do modelo ONNX |
Uso como Biblioteca
AegisGate MCP pode ser incorporado como uma biblioteca 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()
}
Consulte examples/simple-server/ para um exemplo completo e funcional que registra uma ferramenta, recurso e prompt.
Troca a Quente do Modelo ML
Recarregue o modelo neural de detecção de ameaças em tempo de execução sem reiniciar o 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)
}
Detecção de Envenenamento de Ferramentas
Todas as ferramentas registradas via RegisterTool() são automaticamente verificadas quanto a injeção de prompt em suas descrições e inputSchema. Para verificar manualmente:
err := server.ScanToolForPoisoning("my_tool", description, inputSchema)
if err != nil {
// err is *ToolPoisoningError — do not register this tool
}
Camadas de Segurança
AegisGate MCP aplica 22 camadas de segurança a cada requisição, em ordem:
| # | Camada | Descrição | Fonte |
|---|---|---|---|
| 1 | Autenticação | Token Bearer + chave de API, comparação em tempo constante, bloqueio automático em falhas repetidas | auth.go |
| 2 | Verificação de Assinatura | ECDSA P-256 antifalsificação — verifica assinaturas de mensagens contra chaves públicas confiáveis | auth.go |
| 3 | Gerenciamento de Sessão | IDs de sessão aleatórios criptograficamente de 256 bits, expiração, verificações anti-sequestro | session.go |
| 4 | RBAC | Hierarquia de funções de 4 níveis (restrito → padrão → privilegiado → administrador), permissões por ferramenta | rbac.go |
| 5 | Mecanismo de Políticas | Regras de permitir/negar com condições, prioridades, janelas de tempo e padrões de parâmetros | policy.go |
| 6 | Salvaguardas | Limites de chamadas de ferramentas por sessão e limitação de taxa | guardrails.go |
| 7 | Análise de Cadeia | Detecta escalonamento de privilégios, cadeias de exfiltração de dados e chamadas repetidas de ferramentas perigosas | guardrails.go |
| 8 | Limitação de Taxa com Token Bucket | Limitação de taxa com janela deslizante usando algoritmo token bucket (RPM + capacidade de rajada) | guardrails.go |
| 9 | Verificação de Entrada | Verifica parâmetros de ferramentas quanto a injeção de prompt antes da execução (~30 padrões) | handler.go, scanner.go |
| 10 | Verificação de Resposta | Verifica respostas de ferramentas quanto a PII, segredos, XSS e injeção de prompt (~30 padrões de detecção) | scanner.go |
| 11 | Redação de Segredos | Remove dados sensíveis (PII, segredos) das respostas antes de retornar ao cliente | scanner.go |
| 12 | Tempo Limite de Execução de Ferramentas | Tempo limite configurável por chamada evita ferramentas travadas ou descontroladas | handler.go |
| 13 | Validação STDIO | Prevenção de injeção de shell via allowlist + blocklist para comandos de transporte stdio | stdio_guard.go |
| 14 | Registro de Auditoria | Todas as ações MCP registradas em arquivo + memória, consultáveis para conformidade, cadeia de hash à prova de adulteração | audit.go |
| 15 | Transporte TLS / mTLS | Conexões TCP criptografadas com TLS mútuo opcional | config.go, server.go |
| 16 | Transporte stdio | Transporte padrão de cliente MCP para Claude Desktop, Cursor e outras integrações locais | transport.go |
| 17 | Endpoint de Saúde | Endpoints HTTP /healthz, /readyz, /stats em um listener separado | transport.go |
| 18 | Validação de Parâmetros | Campos obrigatórios verificados contra o inputSchema de cada ferramenta antes da execução | handler.go |
| 19 | Detecção Neural de Ameaças (L3) | O modelo CharCNN-BiLSTM v13 pontua ataques semânticos e variantes de evasão que o regex não detecta. Bloqueio em dois níveis: ≥0,95 bloqueia de forma independente, 0,50–0,94 exige corroboração L1/L2 | internal/ml/ |
| 20 | Detecção Heurística de Evasão | Detecta transposição, remoção de vogais, inversão de palavras, leet speak, codificação, divisão e ofuscação com caracteres de largura zero | internal/ml/evasion_resistance.go |
| 21 | Normalização Unicode NFKC | Mapeia caracteres de compatibilidade Unicode para formas canônicas antes da verificação — derrota ataques de homóglifos e ligaduras (largura total Ignore → ignore) | internal/ml/normalizer.go |
| 22 | Detecção de Envenenamento de Ferramentas | Verifica descrições de ferramentas e inputSchema recursivamente quanto a injeção de prompt no momento do registro — rejeita ferramentas envenenadas antes que possam ser chamadas. Mapeia para OWASP MCP Top 10 M1 | handler.go |
⚙️ Configuração
Prioridade de Configuração
A configuração é resolvida em ordem de maior para menor prioridade:
- Flags de CLI — substituem tudo
- Variáveis de ambiente — substituem o arquivo de configuração
- Arquivo de configuração JSON (
--config) — substitui os padrões embutidos - Padrões embutidos
Flags de CLI
Todas as flags de CLI têm equivalentes em variáveis de ambiente:
| Sinalização | Variável de Ambiente | Padrão | Descrição |
|---|---|---|---|
--addr | MCP_SERVER_ADDR | :8081 | Endereço de escuta (modo TCP) |
--transport | MCP_TRANSPORT | tcp | Modo de transporte: tcp, stdio ou http (HTTP Streamable) |
--token | MCP_AUTH_TOKEN | (vazio) | Token Bearer para autenticação |
--audit | MCP_AUDIT_LOG | (vazio) | Caminho do arquivo de log de auditoria |
--max-sessions | MCP_MAX_SESSIONS | 50 | Máximo de sessões simultâneas |
--max-connections | MCP_MAX_CONNECTIONS | 1000 | Máximo de conexões TCP simultâneas (-1 = ilimitado) |
--rate-limit | MCP_RATE_LIMIT_RPM | 60 | Limite de taxa (requisições/min) |
--exec-timeout | MCP_EXEC_TIMEOUT | 30 | Tempo limite de execução de ferramentas (segundos) |
--scan-responses | MCP_SCAN_RESPONSES | true | Habilitar varredura de respostas |
--block-pii | MCP_BLOCK_PII | true | Bloquear respostas contendo PII |
--block-secrets | MCP_BLOCK_SECRETS | true | Bloquear respostas contendo segredos |
--block-xss | MCP_BLOCK_XSS | true | Bloquear respostas contendo XSS |
--block-prompt-inject | MCP_BLOCK_PROMPT_INJECT | true | Bloquear respostas contendo injeção de prompt |
--redact | MCP_REDACT_ENABLED | false | Habilitar redação de segredos/PII |
--redact-pii | MCP_REDACT_PII | false | Redigir PII das respostas |
--redact-secrets | MCP_REDACT_SECRETS | true | Redigir segredos das respostas |
--redact-placeholder | MCP_REDACT_PLACEHOLDER | [REDACTED] | Texto do marcador de redação |
--tls | MCP_TLS_ENABLED | false | Habilitar transporte TLS |
--tls-cert | MCP_TLS_CERT | (vazio) | Arquivo de certificado do servidor (PEM) |
--tls-key | MCP_TLS_KEY | (vazio) | Arquivo de chave privada do servidor (PEM) |
--tls-client-ca | MCP_TLS_CLIENT_CA | (vazio) | Pacote de CA para certificados de cliente (habilita mTLS) |
--tls-min-version | MCP_TLS_MIN_VERSION | 1.2 | Versão mínima do TLS: 1.2 ou 1.3 |
--health-addr | MCP_HEALTH_ADDR | (vazio) | Endereço de escuta do endpoint de saúde (vazio = desabilitado) |
--config | MCP_CONFIG_FILE | (vazio) | Caminho do arquivo de configuração JSON |
--demo | MCP_DEMO_TOOLS | false | Registrar ferramentas de demonstração (ping, system_info, echo) |
--ml | MCP_ML_ENABLED | false | Habilitar detecção neural de ameaças (L3, requer build CGO) |
--ml-shadow | MCP_ML_SHADOW | false | Modo sombra de ML: registrar previsões, mas nunca bloquear |
--ml-threshold | MCP_ML_THRESHOLD | 0.50 | Limite de pontuação de ameaça de ML (0.0–1.0) |
--ml-model | MCP_ML_MODEL | ./models/threat_cnn_bilstm.onnx | Caminho para o arquivo do modelo ONNX |
Arquivo de Configuração 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 | Sinalização | Descrição |
|---|---|---|
tcp | --transport tcp (padrão) | Listener TCP, suporta criptografia TLS/mTLS para implantações em rede |
stdio | --transport stdio | Transporte padrão MCP stdin/stdout para clientes locais (Claude Desktop, Cursor) |
http | --transport http | HTTP Streamable (MCP 2025-06-18) — POST JSON-RPC para o endpoint /mcp, com gerenciamento de sessão Mcp-Session-Id, streaming SSE via cabeçalho Accept, DELETE para encerramento de sessão, suporta proxies reversos com terminação TLS |
Endpoints de Saúde
Quando --health-addr está definido, um listener HTTP separado fornece endpoints de observabilidade:
| Endpoint | Método | Descrição |
|---|---|---|
/healthz | GET | Sonda de vivacidade — retorna 200 OK se o processo do servidor estiver em execução |
/readyz | GET | Sonda de prontidão — retorna 200 OK se o servidor estiver pronto para aceitar requisições |
/stats | GET | Estatísticas do servidor como JSON (sessões, limites de taxa, chamadas de ferramentas, active_connections, max_connections) |
🔐 RBAC & Mecanismo de Políticas
Papéis RBAC
AegisGate MCP impõe uma hierarquia de papéis de 4 níveis. Os papéis são ordenados: restricted < standard < privileged < admin.
| Papel | Nível | Acesso | Exemplos de Ferramentas |
|---|---|---|---|
restricted | 0 | Somente ferramentas somente leitura | ping, system_info, file_exists, git_status, git_log |
standard | 1 | Leitura + escrita de baixo risco | file_read, code_search, web_search, file_copy |
privileged | 2 | Tudo, exceto execução de alto risco | Todas as ferramentas, exceto shell_command, code_execute |
admin | 3 | Todas as ferramentas, sem restrições | Todas as ferramentas registradas |
A comparação de papéis usa AgentRole.AtLeast() — um agente privileged pode acessar qualquer ferramenta que exija standard ou restricted, mas não ferramentas que exijam admin.
Mecanismo de Políticas
O Mecanismo de Políticas avalia regras de permitir/negar antes de qualquer ferramenta ser executada. As regras suportam:
- Correspondência de nomes de ferramentas — nomes exatos e padrões curinga
- Condições de papel do agente — aplicar regras apenas a papéis específicos
- Limites de pontuação de risco — acionar em valores de
RiskAbove - Prioridades — regras de prioridade mais alta avaliadas primeiro
- Janelas de tempo — restringir ferramentas a intervalos de tempo específicos
- Padrões de parâmetros — corresponder aos parâmetros de chamada de ferramenta
- Ações — permitir, negar (com motivo), nível de log, modificadores de risco
Regras de Política Integradas
Carregadas via LoadDefaultPolicies():
| ID da Regra | Prioridade | Ação | Condição | Descrição |
|---|---|---|---|---|
block-shell-commands | 100 | Negar | Nomes de ferramentas: shell_command, bash, exec, cmd, terminal; Papéis: restrito, padrão, privilegiado | Comandos de shell exigem papel de administrador |
block-file-delete | 90 | Negar | Nomes de ferramentas: file_delete, rm, unlink, remove; Papéis: restrito, padrão | Exclusão de arquivos exige papel privilegiado ou administrador |
block-network-write | 80 | Negar | Nomes de ferramentas: http_request, web_search, fetch_url, curl, wget; Papéis: restrito | Operações de rede não permitidas para agentes restritos |
alert-high-risk | 50 | Permitir + Alerta | Pontuação de risco > 70 | Sinaliza operações de alto risco para registro de auditoria |
Regras personalizadas podem ser adicionadas programaticamente:
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álise de Cadeia
O Analisador de Cadeia rastreia sequências de chamadas de ferramentas dentro de uma sessão (janela deslizante de 20 chamadas) e sinaliza padrões suspeitos:
| Detecção | Sinalização | Acionador |
|---|---|---|
| Escalonamento de Privilégios | privilege_escalation | Chamada de ferramenta de baixo risco seguida por uma ferramenta de alto risco (shell_command, file_delete, db_query) |
| Exfiltração de Dados | data_exfiltration_chain | Leitura de dados sensíveis (file_read, db_query, code_search) seguida por uma escrita externa (http_request, file_write, web_search) |
| Ferramentas Perigosas Repetidas | repeated_dangerous_tools | 3+ chamadas de ferramentas de alto risco dentro da janela de análise |
Quando qualquer sinalização é levantada, o risco da cadeia é definido como Alto e o evento é registrado no nível WARN com o ID da sessão, sinalizações e contagem de chamadas.
✍️ Verificação de Assinatura
AegisGate MCP suporta assinatura de mensagens ECDSA P-256 para prevenir falsificação e adulteração de requisições.
Os clientes assinam o JSON canônico de cada requisição (com os campos Signature e KeyID zerados)
e incluem a assinatura no cabeçalho da requisição.
Configuração do Servidor
server, _ := mcp.NewSecuredMCPServer(cfg)
// Register a trusted client public key (SEC1 encoded)
server.AddTrustedKey("agent-001", clientPubKeySEC1)
Assinatura do Cliente (exemplo)
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)
}
O servidor verifica a assinatura usando ecdsa.VerifyASN1 contra a chave pública confiável.
Se nenhum KeyID ou Signature estiver presente, a verificação é ignorada — permitindo interoperabilidade
com clientes não assinados enquanto impõe assinaturas para clientes que as fornecem.
🧪 Testes & Desempenho
Cobertura de Testes
| Categoria | Testes | Cobertura |
|---|---|---|
| Unitário + integração (não-CGO) | 425 | 90.8% |
| Unitário + integração (CGO + ML) | 429 | 91.4% |
Carga / ruptura / imersão (tag de build: load) | 9 | — |
| Benchmarks | 10 | — |
| Alvos de fuzzing | 3 | — |
Executando Testes
# 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 Desempenho
Validadas via suíte de testes de carga (//go:build load):
| Métrica | Valor | Teste |
|---|---|---|
| Taxa de transferência sustentada | 14.427 req/seg | TestLoadSustainedThroughput |
| Latência p50 (100 concorrentes) | 34 ms | TestLoadConcurrentConnections |
| Latência p99 (100 concorrentes) | 46 ms | TestLoadConcurrentConnections |
| Taxa de rotatividade de conexões | 2.662 conexões/seg | TestConnectionChurn |
| Vazamentos de goroutines (imersão de 10s) | 0 | TestSoakStability |
| Desligamento gracioso sob carga | 1,6 ms | TestShutdownUnderLoad |
📦 Zero Dependências de Módulos
AegisGate MCP tem zero dependências externas de módulos. O arquivo go.mod contém
nenhuma diretiva require. Todo o código de terceiros (bindings ONNX Runtime, normalização
Unicode, modelo de ML) é fornecido em internal/, lib/ e 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 fornecidos (veja NOTICE para atribuição completa):
| Componente | Licença | Localização |
|---|---|---|
| onnxruntime_go (bindings Go) | MIT | internal/onnxruntime_go/ |
| libonnxruntime.so (Microsoft) | MIT | lib/amd64/, lib/arm64/ |
| golang.org/x/text (norm. Unicode) | BSD-3-Clause | internal/textnorm/ |
| Modelo CharCNN-BiLSTM v13 | Apache-2.0 | models/ |
Por que isso importa:
- Implantação isolada — nenhum
go mod downloadnecessário, sem risco de cadeia de suprimentos - Sem dependências transitivas — nada para auditar além do código fornecido
- Builds reproduzíveis — o binário é idêntico entre builds
- Superfície de ataque mínima — todo o código de terceiros é visível e auditável
- Compilação rápida — sem sobrecarga de resolução de dependências
🏗️ Arquitetura & Protocolo
Arquitetura
┌─────────────────────────────────────────────────────────────────────────┐
│ 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) │
└─────────────────────────────────────────────────────────────────────────┘
Fluxo de requisição:
- Cliente TCP conecta (opcionalmente via TLS/mTLS) ou stdio envia JSON-RPC via stdin
- Middleware de Autenticação valida token bearer/chave de API (tempo constante), verifica assinatura ECDSA, cria/valida sessão
- Guardrails impõem limites de taxa, limites de sessão e executam análise de cadeia
- Varredura de Resposta (validação de parâmetros pré-execução acontece no handler)
- Handler de Requisição verifica permissões RBAC, avalia regras do Mecanismo de Políticas, valida parâmetros obrigatórios contra
inputSchema, executa ferramenta com tempo limite - Varredura de Resposta (pós-execução) varre a saída da ferramenta para PII, segredos, XSS, injeção de prompt; redige se habilitado
- Log de Auditoria registra a cadeia completa de ações
Suporte ao Protocolo MCP
AegisGate MCP implementa os seguintes métodos JSON-RPC (Protocolo MCP 2025-06-18):
| Método | Tipo | Descrição |
|---|---|---|
initialize | Solicitação | Analisa clientInfo, retorna serverInfo + capacidades (ferramentas, recursos, prompts, logging) |
notifications/initialized | Notificação | Tratada silenciosamente — nenhuma resposta enviada (conforme especificação MCP) |
notifications/cancelled | Notificação | Cancelamento iniciado pelo cliente — registrado, nenhuma resposta enviada |
notifications/tools/list_changed | Iniciado pelo servidor | Enviado quando ferramentas são adicionadas ou removidas |
notifications/resources/list_changed | Iniciado pelo servidor | Enviado quando recursos são adicionados ou removidos |
notifications/resources/updated | Iniciado pelo servidor | Enviado quando o conteúdo de um recurso inscrito muda |
notifications/prompts/list_changed | Iniciado pelo servidor | Enviado quando prompts são adicionados ou removidos |
tools/list | Solicitação | Retorna ferramentas registradas com descrições e inputSchema. Suporta paginação baseada em cursor |
tools/call | Solicitação | Executa uma ferramenta após passar por todas as camadas de segurança |
resources/list | Solicitação | Retorna recursos registrados (URIs, nomes, descrições). Suporta paginação baseada em cursor |
resources/read | Solicitação | Lê um recurso por URI — chama o ResourceHandlerFunc registrado |
resources/templates/list | Solicitação | Retorna modelos de URI registrados para recursos parametrizados |
resources/subscribe | Solicitação | Inscreve a sessão em notificações de atualização de recursos para uma URI |
resources/unsubscribe | Solicitação | Remove uma inscrição de recurso |
prompts/list | Solicitação | Retorna prompts registrados (nomes, descrições, argumentos). Suporta paginação baseada em cursor |
prompts/get | Solicitação | Obtém um prompt pelo nome com argumentos opcionais — chama o PromptHandlerFunc registrado |
ping | Solicitação | Verificação de saúde — retorna resposta de sucesso vazia |
Gerenciamento de sessão HTTP Streamable (v1.2.2+):
POST /mcpcominitialize→ a resposta inclui o cabeçalhoMcp-Session-IdPOST /mcpcom solicitações subsequentes → deve incluir o cabeçalhoMcp-Session-IdDELETE /mcpcom o cabeçalhoMcp-Session-Id→ encerra a sessão (204 No Content)- Sessões expiram após 30 minutos de inatividade
🏭 Casos de Uso e Cenários de Implantação
O AegisGate MCP atende qualquer ambiente onde agentes de IA interagem com ferramentas — desde plataformas SaaS em nuvem até pipelines de dados empresariais e redes de plantas OT/ICS. As mesmas 21 camadas de segurança se aplicam independentemente do contexto de implantação.
Implantações Gerais
- SaaS em nuvem — protege recursos de IA voltados ao usuário contra injeção de prompt e exfiltração de dados
- Acesso a dados empresariais — aplica RBAC e auditoria de logs em consultas a bancos de dados conduzidas por agentes
- Automação CI/CD — restringe o que pipelines assistidos por IA podem executar
- Redes isoladas (air-gapped) — zero dependências significa que o servidor funciona sem acesso à internet
Ambientes OT/ICS
Em um ambiente OT/ICS, o AegisGate MCP fica entre agentes de IA e ferramentas de infraestrutura crítica:
AI Agent (Claude, Cursor, custom)
│
▼
┌──────────────────┐
│ AegisGate MCP │ ← 22 security layers
│ (TLS/mTLS) │
└────────┬─────────┘
│
┌────┼────┬────┬────┐
▼ ▼ ▼ ▼ ▼
SCADA PLC Hist Tag Log
Read Status Query DB Analyzer
Cenários típicos de implantação:
- Agente de monitoramento somente leitura — função
restricted, pode consultar status SCADA e dados de histórico, mas não pode emitir comandos - Agente de manutenção — função
standard, pode ler arquivos e pesquisar código durante solução de problemas - Agente de operações — função
privileged, pode interagir com a maioria das ferramentas, mas não pode executar comandos de shell - Agente administrador — função
admin, acesso total para janelas de manutenção autorizadas
Recursos de segurança particularmente relevantes para OT/ICS:
- TLS/mTLS criptografa todo o tráfego na rede da planta
- Políticas de janela de tempo restringem ferramentas de alto risco a janelas de manutenção
- Análise de cadeia detecta se um agente lê dados sensíveis de processo e depois tenta uma gravação externa na rede (exfiltração)
- Auditoria de logs fornece uma cadeia completa de custódia para conformidade (NERC CIP, IEC 62443)
- Operação isolada (air-gapped) — zero dependências significa que o servidor pode ser implantado em redes isoladas sem acesso à internet
Ferramentas de Demonstração
Ative as ferramentas de demonstração com a flag --demo ou chamando RegisterDemoTools() no modo biblioteca.
São ferramentas seguras e somente leitura que não acessam o sistema de arquivos, rede ou quaisquer recursos externos.
| Ferramenta | Nível de Risco | Parâmetros Necessários | Descrição |
|---|---|---|---|
ping | 10 | (nenhum) | Retorna "pong" — ferramenta de verificação de saúde |
system_info | 30 | (nenhum) | Retorna versão do Go, SO, arquitetura, contagem de CPUs, contagem de goroutines, timestamp |
echo | 20 | message (string) | Ecoa de volta a mensagem fornecida |
Exemplo — resposta de system_info:
{
"go_version": "go1.26.9",
"os": "linux",
"arch": "amd64",
"cpus": 8,
"goroutines": 12,
"timestamp": "2026-10-08T08:58:00Z"
}
Documentação
Documentação detalhada está disponível no diretório docs/:
| Documento | Descrição |
|---|---|
docs/getting-started.md | Instalação, primeira execução e configuração básica |
docs/deployment-guide.md | Implantação em produção: Docker, TLS, configurações air-gapped |
docs/admin-guide.md | Administração: sessões, logs de auditoria, gerenciamento de RBAC, políticas |
docs/how-to-guides.md | Guias específicos de tarefas: ferramentas personalizadas, verificação de assinatura, configuração de mTLS |
docs/building-your-first-server.md | Tutorial: construa um servidor MCP seguro completo do zero com ferramentas personalizadas, RBAC e políticas |
docs/integrating-with-cursor.md | Conecte o Cursor ao AegisGate MCP via transporte HTTP Streamable |
docs/model-card.md | Detalhes do modelo de ML: arquitetura, dados de treinamento, métricas de desempenho |
docs/comparison.md | Comparação de recursos: AegisGate MCP vs SDKs MCP oficiais e wrappers complementares |
docs/owasp-mcp-top-10.md | Mapeamento de riscos OWASP MCP Top 10 — cobertura para todos os 10 riscos de segurança |
docs/v1.3.0-roadmap.md | Roadmap para streaming SSE, notificações iniciadas pelo servidor, inscrições de recursos e modelos de recursos (P1–P4 concluídos) |
Changelog
Consulte CHANGELOG.md para histórico de versões e mudanças notáveis.
Quando Atualizar para a Plataforma AegisGate
O AegisGate MCP é um framework de servidor MCP seguro e autônomo — perfeito para construir e executar servidores MCP com segurança integrada. É gratuito, de código aberto e possui zero dependências externas.
Quando suas necessidades crescerem além de um único servidor, a Plataforma AegisGate é o caminho natural de atualização:
| Necessidade | AegisGate MCP (gratuito) | Plataforma AegisGate |
|---|---|---|
| Framework de servidor MCP seguro | ✅ 22 camadas, zero dependências | ✅ Servidor MCP embutido |
| Detecção de ameaças por ML | ✅ Limitado a 100 inf/min (servidor único) | ✅ Ilimitado, em toda a organização |
| Modo proxy/gateway | ❌ Framework, não proxy | ✅ Fica entre clientes e todos os serviços de IA |
| OAuth 2.0 / OIDC / SSO | ❌ Tokens Bearer + chaves de API | ✅ SAML, OIDC, JWT |
| Integração SIEM | ❌ Auditoria baseada em arquivo + Prometheus | ✅ Splunk, Elasticsearch, QRadar, Datadog (11 plataformas) |
| Frameworks de conformidade | ❌ Nenhum | ✅ 31 frameworks (HIPAA, PCI, SOC 2, EU AI Act, NIST, etc.) |
| Multiprotocolo (HTTP, A2A, ACP) | ❌ Somente MCP | ✅ 6 pilares |
| Escala empresarial | ⚠️ 250 conexões, 25 sessões | ✅ Ilimitado |
Pense desta forma: O AegisGate MCP é a base segura sobre a qual você constrói servidores MCP. A Plataforma AegisGate é o gateway empresarial que protege todo o tráfego de IA na sua organização — incluindo MCP, HTTP, A2A e ACP.
Outros produtos AegisGate:
- AegisGate Rampart — Proxy local gratuito para desenvolvedores que usam Claude, Cursor ou Copilot
- AegisGate Lens — Extensão de navegador gratuita para conversas cotidianas com IA
Licença
Apache-2.0. Consulte LICENSE para o texto completo e NOTICE para atribuição.
Segurança
Consulte SECURITY.md para relatar vulnerabilidades.
Contribuição
Consulte CONTRIBUTING.md. Todos os commits devem ser assinados (git commit -s) conforme o DCO.
Aviso de Propriedade Intelectual
As tecnologias centrais do AegisGate têm pedidos de patente pendentes no USPTO (Nºs de Pedido Provisório 64/153.573–64/153.577, depositados em 12 de setembro de 2026). O código-fonte é © 2025-2026 AegisGate Security, LLC. Licenciado sob Apache 2.0.
Marca Registrada
AegisGate Security™ é uma marca registrada da AegisGate Security, LLC, depositada no Escritório de Patentes e Marcas dos Estados Unidos (USPTO). A marca foi publicada para oposição em 13 de outubro de 2026.
AegisGate MCP é um nome de produto não registrado da AegisGate Security, LLC. O símbolo ™ não é usado para este nome de produto, pois ele não foi depositado separadamente como pedido de marca registrada. O uso da marca "AegisGate Security" é regido pelo Lanham Act (15 U.S.C. § 1126) e pela legislação estadual aplicável de marcas registradas.
É concedida permissão para usar o nome e as marcas AegisGate em conexão com a distribuição de software de código aberto não modificado, conforme publicado no GitHub. O uso do nome, logotipo ou outros ativos de marca AegisGate em obras derivadas, produtos comerciais, ofertas de serviços ou materiais de marketing requer permissão prévia por escrito da AegisGate Security, LLC.
Contato: legal@aegisgatesecurity.io
🌐 AegisGate Security · 💬 Discord · ✉️ support@aegisgatesecurity.io · 𝕏 @aegisgate · 📱 Telegram · 🐘 @aegisgate@mastodon.social
Feito com 🖤 pelos desenvolvedores da AegisGate Security para proteger a superfície de ataque da IA.