Pular para o conteúdo

Secrets MCP (Floopy 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 EncryptionContext org_id + dek_version.
  • Plaintext nunca em cache no processo. A DEK desempacotada usa state.dek_cache brevemente; 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.

snake_case minúsculo, começando com letra:

^[a-z][a-z0-9_]*$

Exemplos:

  • mcp_search_api_key
  • github_pat_eval_bot
  • internal_jira_token

Nomes são únicos por organização. Duas orgs podem usar o mesmo nome sem colidir.


Em MCP → Secrets, clique em Novo segredo. Informe:

  1. Nome de referênciasnake_case.
  2. 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.


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.


  • vault.read — emitido a toda resolução bem-sucedida. Metadata leva secret_ref e o consumer (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.


  1. Crie o segredo novo com nome temporário (*_v2).
  2. Aponte os servidores afetados para a nova ref.
  3. Verifique (via botão Test no editor de servidor) que o upstream está saudável.
  4. Apague o segredo antigo.
  5. (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.