Skip to content

Clientes MCP

O keyholder-mcp fala MCP por stdio, então qualquer cliente MCP consegue iniciá-lo. Esta página mostra Claude Code, Cursor e Codex.

Deixe o token fora dos arquivos de configuração

Todos os clientes abaixo conseguem ler o token embrulhado do ambiente do seu shell, em vez de um arquivo. Exporte-o no terminal que inicia o cliente:

export BAO_WRAPPING_TOKEN="$(bao token create -policy=my-project-read -ttl=8h -explicit-max-ttl=8h -wrap-ttl=5m -field=wrapping_token)"

Mesmo que acabe num arquivo, o token embrulhado é de uso único: depois que o keyholder-mcp o desembrulha, o valor não serve para nada. Cada partida do servidor precisa de um novo, e é assim que o acesso é renovado fora do chat.

Claude Code

Pela CLI (documentação oficial):

claude mcp add \
  --env BAO_ADDR=http://127.0.0.1:8200 \
  --env KEYHOLDER_SCOPE=my-project \
  --env KEYHOLDER_ALLOW=curl,aws,gcloud \
  --transport stdio --scope project \
  keyholder -- keyholder-mcp

O nome do servidor não pode vir logo depois de um --env, senão a CLI o lê como outro CHAVE=valor; mantenha --transport ou --scope no meio. Com --scope project a entrada é gravada no .mcp.json; acrescente a linha BAO_WRAPPING_TOKEN mostrada abaixo para o token vir do seu ambiente.

No .mcp.json na raiz do projeto, o Claude Code expande ${VAR} a partir do seu ambiente:

{
  "mcpServers": {
    "keyholder": {
      "type": "stdio",
      "command": "keyholder-mcp",
      "env": {
        "BAO_ADDR": "http://127.0.0.1:8200",
        "BAO_WRAPPING_TOKEN": "${BAO_WRAPPING_TOKEN}",
        "KEYHOLDER_SCOPE": "my-project",
        "KEYHOLDER_ALLOW": "curl,aws,gcloud"
      }
    }
  }
}

Confira com claude mcp get keyholder ou /mcp dentro do Claude Code.

Cursor

Em .cursor/mcp.json (projeto) ou ~/.cursor/mcp.json (global) (documentação oficial); o Cursor expande ${env:NOME}:

{
  "mcpServers": {
    "keyholder": {
      "type": "stdio",
      "command": "keyholder-mcp",
      "env": {
        "BAO_ADDR": "http://127.0.0.1:8200",
        "BAO_WRAPPING_TOKEN": "${env:BAO_WRAPPING_TOKEN}",
        "KEYHOLDER_SCOPE": "my-project",
        "KEYHOLDER_ALLOW": "curl,aws,gcloud"
      }
    }
  }
}

Codex

Em ~/.codex/config.toml (documentação oficial); env_vars encaminha variáveis do seu ambiente:

[mcp_servers.keyholder]
command = "keyholder-mcp"
env_vars = ["BAO_WRAPPING_TOKEN"]

[mcp_servers.keyholder.env]
BAO_ADDR = "http://127.0.0.1:8200"
KEYHOLDER_SCOPE = "my-project"
KEYHOLDER_ALLOW = "curl,aws,gcloud"

Ou pela CLI:

codex mcp add keyholder --env BAO_ADDR=http://127.0.0.1:8200 --env KEYHOLDER_SCOPE=my-project \
  --env KEYHOLDER_ALLOW=curl,aws,gcloud -- keyholder-mcp

O Codex pergunta antes de cada chamada de tool MCP. O codex exec não tem como perguntar, então toda chamada falha com MCP tool call requires approval, but approval policy is never, a menos que as tools do servidor estejam aprovadas na configuração:

[mcp_servers.keyholder]
default_tools_approval_mode = "approve"

As proteções continuam valendo: quem decide o que roda são KEYHOLDER_ALLOW e KEYHOLDER_SCOPE, não a aprovação.

Outros clientes

Qualquer cliente que inicie um servidor stdio com um comando e variáveis de ambiente funciona: o comando é keyholder-mcp, sem argumentos, e as variáveis estão em Configuração.

O que o agente vê

Tool Devolve
keyholder_status Estado do cofre e da sessão, TTL, políticas; nunca o token
keyholder_list Nomes de referências vault:// no escopo
keyholder_run Código de saída, stdout e stderr mascarados, referências usadas

Entradas e saídas campo a campo: Configuração → Tools.

Verificado

Os comandos e formatos de arquivo desta página vêm da documentação oficial de cada cliente, nos links acima. Os tutoriais exercitam o servidor com o khcall; os clientes em si não rodam no CI.