MCP Fusion/Security and governance/Pipeline de segurança
Pipeline de segurança
Todas as camadas entre um agente e seus dados, em ordem: firewall de entrada, validação estrita, middleware de tenant, Presenters, o motor de redação, o limitador de egresso, o firewall de prompt e o sandbox.
O MCP Fusion aplica segurança como um pipeline de camadas, cada uma com uma posição clara na requisição. Esta página é o mapa técnico: o que roda, em que ordem, com que garantias.
A ordem, de ponta a ponta
1 contextFactory tenant and identity resolution
2 rate limiter sliding window, key from ctx
3 input firewall LLM-as-Judge on the arguments
4 validate strict Zod per action, unknown keys rejected
5 middleware chain auth, audit, custom, precompiled and frozen
6 handler your business logic
7 Presenter schema shape → _select → redact → serialize
8 rules and UI computed on the full object, never on the wire copy
9 egress guard byte budget on the text response
10 audit + telemetry every stage emits if a sink is configuredCamada por camada
Rate limiter
rateLimit({ windowMs, limit, keyFn }) é um middleware que usa uma janela deslizante sobre listas de timestamps. Duas chamadas importam: increment() conta sem registrar, e record() só grava requisições aceitas, então tráfego rejeitado não pode inflar a própria janela. keyFn(ctx) é o gancho de identidade: limite por token, por tenant ou por usuário. O store é uma interface; o store em memória é documentado como válido só para um processo, e a produção usa o seu Redis ou KV atrás da mesma interface.
Firewall de entrada
inputFirewall({ judge }) roda depois da validação Zod e antes do seu handler. Os argumentos são serializados em um prompt de julgamento (crases neutralizadas para impedir escape de fence), e um SemanticProbeAdapter plugável devolve { safe, threats }. Se !safe, o handler nunca é chamado: a resposta é um toolError('INPUT_REJECTED', ...) autorreparável. Esta camada é para entradas em forma de injeção: "ignore as instruções anteriores", payloads de exfiltração, caminhos de arquivo contrabandeados.
Redação do Presenter (o firewall de egresso)
.redactPII(paths, censor?) compila caminhos fast-redact em uma única função, armazenada em cache no Presenter. A ordem do pipeline dentro de Presenter.make() é precisa: truncar, validar, aplicar _select, clonar os dados do wire, mascarar, serializar em string, e então renderizar blocos de UI e regras a partir do objeto completo sem máscara. Consequências:
- o texto do modelo nunca contém campos mascarados;
[REDACTED]nem chega ao wire para chaves ocultas por_select - os blocos de
ui.table()mantêm os valores reais (são construídos a partir do objeto completo em memória, e o texto do wire já está congelado) - se o
structuredCloneou o redator lançar um erro, o pipeline também lança:Data withheld to prevent PII leak. A redação é fail-closed nesse ponto.
fast-redact é um peer opcional. Se não estiver instalado, o redator degrada para um no-op com um aviso no console. Trate-o como dependência obrigatória para conectores que guardam dados pessoais.
Firewall de prompt
As próprias regras são superfície de ataque: regras dinâmicas são geradas a partir de dados, e os dados vêm do mundo do agente. presenter.promptFirewall({ judge }) envia as regras de sistema acumuladas a um juiz antes que qualquer uma delas chegue ao modelo. A estratégia é fail-closed e por regra: se o juiz sinaliza o lote mas nomeia algumas regras, as não nomeadas também são bloqueadas. O modo de consenso (todos os juízes concordam) não tem fail-open. Configurar um firewall força o caminho assíncrono: make() lança, makeAsync() é o contrato.
Sandbox
sandboxed() em uma tool anuncia delegação de computação: o agente envia uma função de seta JS, o SandboxEngine a executa dentro de um contexto isolated-vm novo, com os dados injetados como cópia externa, e só o valor devolvido volta. Padrões: timeout de 5s, isolate de 128MB, limite de saída de 1MB, limite de código de 64KB. process, require, fs, globalThis e Buffer não existem dentro do contexto; a guarda que rejeita padrões óbvios é só DX e explicitamente não é a fronteira. No cancelamento, o engine descarta o isolate (ou libera só o contexto quando outras requisições o compartilham) e o recria na próxima chamada.
Kill switch e halt
A parada de emergência fica no console, veja Connector policy: o halt global e a política por conector. No Edge, conectores barrados param de servir chamadas sem um novo deploy.
O que o framework não faz
Honestidade acima de marketing: o middleware de auditoria do framework emite eventos para o seu sink (digests SHA-256 dos argumentos, classificação de status, sem assinatura, sem cadeia). A cadeia de auditoria assinada e à prova de adulteração é um recurso de hospedagem do Vinkius Cloud: faça deploy com mcpfusion deploy e a plataforma registra isso por você. A mesma divisão vale para os stores de rate limit: a interface é sua, o Edge a executa.
Próximos passos
- Runtime architecture: onde cada camada fica no motor
- Governance: provar que o pipeline permaneceu travado
- Tools: anexar guardas a uma tool
