Keyholder MCP¶
Seu agente de IA usa a credencial. E nunca a vê.
O Keyholder MCP é um servidor MCP sobre o OpenBao. O agente escreve uma referência; o Keyholder coloca o valor real no comando só na hora de executar e devolve a saída com o valor mascarado. O acesso acaba sozinho.
O agente pede ao keyholder_run
curl -sS \ -H "Authorization: Bearer {{vault://my-project/dev/API_TOKEN}}" \ {{vault://my-project/dev/API_URL}}
A API recebe
Authorization: Bearer
tok-fake-not-a-real-secret
O agente lê de volta
api says: hello, caller with
header Authorization: Bearer
[hidden:vault://my-project/dev/API_TOKEN]
Uma execução gravada com um token falso, conferida a cada build do CI: veja o início rápido.
Por que não dar a chave ao agente¶
Agentes precisam de chaves de API, credenciais de nuvem e tokens para fazer trabalho real. Colada no chat, num .env ou num comando escrito pelo modelo, a credencial vai parar na conversa, em logs e em lugares que você vai esquecer. Os outros servidores MCP de OpenBao e Vault que encontramos têm uma tool que lê o segredo para o modelo. O Keyholder não tem nenhuma: o modelo só segura nomes.
Uma execução, do começo ao fim¶
- Você guarda o segredo
No OpenBao, um caminho por projeto. Pela interface web do OpenBao ou pela CLI
bao, fora do chat. - Você emite uma sessão
Um token embrulhado, de uso único, com TTL, entregue ao
keyholder-mcppelo ambiente dele. - O agente roda um comando
Ele envia
{{vault://…}}. O Keyholder resolve na execução, roda um comando permitido sem shell e mascara a saída. - O acesso acaba
No fim do TTL toda chamada falha com uma mensagem clara. Você renova fora do chat; o agente não consegue.
Comparação¶
| Keyholder MCP | mcp-vault | openbao-mcp | vault-mcp-server | |
|---|---|---|---|---|
| Cofre | OpenBao | OpenBao, embutido | OpenBao | HashiCorp Vault |
| O modelo recebe valores | Nunca | Sim, documentado | Tem tool de leitura | Sim, documentado |
| Valor injetado na execução | Sim | Não documentado | Não documentado | Não documentado |
| Saída mascarada | Sim | Não documentado | Não documentado | Não documentado |
| Credencial de nuvem por execução | AWS, GCP; revogada depois | Não documentado | Não documentado | Não documentado |
| Acesso temporário | Token embrulhado, TTL | Wrapping, CA de SSH, PKI | Não documentado | Não documentado |
| O que o agente faz | Roda comandos permitidos | 39 tools: segredos, SSH, PKI, políticas | Operações do cofre | Mounts, KV, PKI |
Pelo README de cada projeto em 2026-10-14. Eles administram o cofre pelo agente; o Keyholder só deixa o agente usá-lo. Detalhes e fontes: Comparação.
O que protege, e o que não¶
Protege
- Os valores ficam fora do chat, dos resultados das tools, dos erros e dos logs.
- Um token de sessão vazado morre com o TTL; um token embrulhado funciona uma vez.
- Só rodam os comandos que você nomeia, e nunca por um shell.
- Referências fora do escopo do projeto são recusadas.
Não protege
- O comando executado recebe o valor: ele precisa dele.
- Um valor codificado escapa: um interpretador liberado contorna o mascaramento, como mostra o tutorial de mascaramento.
- Um agente hostil rodando com o seu usuário do sistema.
A lista completa está no modelo de segurança.
Comece em cinco minutos¶
bao server -dev -dev-root-token-id=root-dev # em memória, para experimentar
export BAO_ADDR=http://127.0.0.1:8200 BAO_TOKEN=root-dev
bao kv put -mount=secret my-project/dev API_TOKEN=seu-token-de-api
bao policy write my-project-read deploy/policy-project-read.hcl
bao token create -policy=my-project-read -ttl=8h -explicit-max-ttl=8h -wrap-ttl=5m -field=wrapping_token
Depois cadastre o keyholder-mcp no Claude Code, Cursor ou Codex com esse token embrulhado. Cada passo explicado: Começando. Cada comportamento, com saída real: Tutoriais.
Versão 0.4.0, licença MIT. Código, issues e releases no GitHub. CLIs de nuvem recebem uma credencial criada para cada execução: credenciais de nuvem. Para segredos reais, rode um cofre persistente. Próximos passos no roteiro: pedidos de acesso pelo agente, SSH.