Secrets MCP (Floopy Vault)
Por que um vault
Seção intitulada “Por que um vault”Servidores MCP outbound (web search, GitHub, MCPs internos) precisam de credenciais. Colar no YAML ou em variáveis de ambiente significa que quem lê a config também tem o segredo — e rotacionar atinge toda config que referencia.
O Floopy Vault centraliza os valores:
- Criptografia em repouso AES-256-GCM com chave de dados (DEK) por linha.
- AWS KMS com envelope encryption — a DEK é envelopada pela CMK com
EncryptionContextorg_id+dek_version. - Plaintext nunca em cache no processo. A DEK desempacotada usa
state.dek_cachebrevemente; o valor em si é decifrado just-in-time a cada chamada e zerado no drop. - Referência, não valor — configs de servidor guardam
secret_ref(um nome); a resolução acontece em request-time.
Formato do nome
Seção intitulada “Formato do nome”snake_case minúsculo, começando com letra:
^[a-z][a-z0-9_]*$Exemplos:
mcp_search_api_keygithub_pat_eval_botinternal_jira_token
Nomes são únicos por organização. Duas orgs podem usar o mesmo nome sem colidir.
Adicionando um segredo
Seção intitulada “Adicionando um segredo”Em MCP → Secrets, clique em Novo segredo. Informe:
- Nome de referência —
snake_case. - Valor — a string do segredo (≤ 64 KiB).
O valor é cifrado ao salvar. A Floopy nunca mostra o texto novamente. Para rotacionar, apague a linha e crie outra — a referência pode ser reusada sem alterar configs que apontam para ela.
A mesma referência também pode ser criada inline no editor de servidor, no Picker de segredo, quando você percebe no meio da config que falta criar.
Permissões (RLS)
Seção intitulada “Permissões (RLS)”Linhas de mcp_vault_secrets ficam isoladas por org via Row-Level Security do Postgres:
- SELECT: qualquer membro da org pode listar
(ref, updated_at)— nunca o ciphertext. - INSERT / UPDATE / DELETE: somente
members.role IN ('owner','admin'). - INSERT exige adicionalmente
created_by = auth.uid()para a auditoria casar com o ator.
Token de uma org nunca enxerga (nem enumera) segredos de outra.
Trilha de auditoria
Seção intitulada “Trilha de auditoria”vault.read— emitido a toda resolução bem-sucedida. Metadata levasecret_refe oconsumer(ex.mcp_outbound_call_tool).vault.write— audit-first: a linha entra ANTES do upsert. Se o canal de auditoria rejeitar, o upsert é abortado.vault.delete— mesmo contrato audit-first.
Leituras são throttled 60s por (org, secret_ref) para que uma ferramenta que resolve o mesmo segredo em várias chamadas não inunde a trilha.
Workflow de rotação
Seção intitulada “Workflow de rotação”- Crie o segredo novo com nome temporário (
*_v2). - Aponte os servidores afetados para a nova ref.
- Verifique (via botão Test no editor de servidor) que o upstream está saudável.
- Apague o segredo antigo.
- (Opcional) Renomeie — apague o temporário, recrie sob o nome original.
Rotação automática está no roadmap. Por enquanto, esse padrão de duas etapas mantém o deploy sem downtime.