Autenticar com vaults
Registre credenciais por usuário ao criar sessões.
Vaults e credenciais são primitivas de autenticação que permitem registrar credenciais para serviços de terceiros uma vez e referenciá-las por ID na criação da sessão. Isso significa que você não precisa executar seu próprio armazenamento de segredos, transmitir tokens em cada chamada ou perder o controle de qual usuário final um agente atuou em nome.
A referência do vault é um parâmetro por sessão, então você pode gerenciar seu produto na granularidade do recurso agent e seus usuários na granularidade do recurso session.
Criar um vault
Um vault é a coleção de credentials associadas a um usuário final. Dê a ele um display_name e, opcionalmente, marque-o com metadata para que você possa mapeá-lo de volta aos seus próprios registros de usuário.
vault = client.beta.vaults.create(
display_name="Alice",
metadata={"external_user_id": "usr_abc123"},
)
print(vault.id) # "vlt_01ABC..."A resposta é o registro completo do vault:
{
"type": "vault",
"id": "vlt_01ABC...",
"display_name": "Alice",
"metadata": { "external_user_id": "usr_abc123" },
"created_at": "2026-03-18T10:00:00Z",
"updated_at": "2026-03-18T10:00:00Z",
"archived_at": null
}Adicionar uma credencial
Duas categorias de credenciais são suportadas:
- Credenciais MCP (
mcp_oauth,static_bearer): cada credencial é indexada por ummcp_server_url. Quando o agente se conecta a um servidor nessa URL no tempo de execução da sessão, o token é injetado automaticamente. - Variáveis de ambiente (
environment_variable): cada credencial é indexada por umsecret_name(o nome da variável de ambiente) e armazenada no sandbox como um placeholder opaco. Quando o agente inicia uma requisição de saída, o placeholder opaco é substituído pelo segredo real na saída. O agente nunca vê o valor do segredo. Use isso para qualquer serviço que autentique através de uma variável de ambiente, como CLIs, SDKs ou chamadas diretas de API.
Os valores reais de credenciais que você fornece (token, access_token, refresh_token, client_secret, secret_value) são tratados como campos sensíveis, somente de escrita, e nunca retornados nas respostas da API.
Use mcp_oauth quando o servidor MCP usa OAuth 2.0. Se você fornecer um bloco refresh, a Anthropic atualiza o token de acesso em seu nome quando ele expira.
O campo refresh.token_endpoint_auth.type indica como autenticar a chamada de atualização:
none: cliente públicoclient_secret_basic: autenticação HTTP Basic com o client secretclient_secret_post: client secret no corpo do POST
credential = client.beta.vaults.credentials.create(
vault_id=vault.id,
display_name="Alice's Slack",
auth={
"type": "mcp_oauth",
"mcp_server_url": "https://mcp.slack.com/mcp",
"access_token": "xoxp-...",
"expires_at": "2099-12-31T23:59:59Z",
"refresh": {
"token_endpoint": "https://slack.com/api/oauth.v2.user.access",
"client_id": "1234567890.0987654321",
"scope": "channels:read chat:write",
"refresh_token": "xoxe-1-...",
"token_endpoint_auth": {"type": "client_secret_post", "client_secret": "abc123..."},
},
},
)Defina refresh.token_endpoint como o endpoint de token do fluxo OAuth que emitiu o "refresh token" (token de atualização), pois a Anthropic envia todas as requisições de atualização para essa URL e o campo não pode ser alterado após a criação da credencial.
Use static_bearer quando o servidor MCP aceita um token bearer fixo (chave de API, token de acesso pessoal ou similar). Nenhum fluxo de atualização é necessário.
bearer_credential = client.beta.vaults.credentials.create(
vault_id=vault.id,
display_name="Linear API key",
auth={
"type": "static_bearer",
"mcp_server_url": "https://mcp.linear.app/mcp",
"token": "lin_api_your_linear_key",
},
)Use environment_variable para autenticar em serviços externos através de uma variável de ambiente, como CLIs, SDKs ou chamadas diretas de API. Credenciais de variável de ambiente funcionam para clientes que enviam o valor do segredo literalmente em uma requisição de saída, então verifique os critérios de elegibilidade do cliente nesta aba antes de configurar uma.
O array networking.allowed_hosts controla para quais hosts de saída o segredo pode ser substituído. Use "type": "limited" com uma lista específica, ou "type": "unrestricted" se o chamador alcança domínios que você não pode enumerar com antecedência.
Limitar domínios é fortemente recomendado por motivos de segurança e evita que sua chave seja compartilhada com hosts não autorizados.
O campo opcional injection_location define o escopo de onde o segredo é substituído; a semântica completa segue o exemplo.
env_credential = client.beta.vaults.credentials.create(
vault_id=vault.id,
display_name="Notion API key for sandbox",
auth={
"type": "environment_variable",
"secret_name": "NOTION_API_KEY",
"secret_value": "ntn_your-secret-here",
"networking": {
"type": "limited",
"allowed_hosts": ["api.notion.com"],
},
"injection_location": {"header": True},
},
)
if env_credential.auth.type == "environment_variable":
location = env_credential.auth.injection_location
print(f"header: {location.header}, body: {location.body}") # header: True, body: FalseOs payloads de requisição são frequentemente montados a partir do conteúdo com o qual o agente está trabalhando, então o corpo da requisição é a superfície de exposição mais ampla. A maioria dos serviços lê uma chave de API de um cabeçalho de requisição, então habilitar apenas header é a configuração mais restrita. Ela limita a substituição aos valores de cabeçalho de requisição para aquela credencial.
O injection_location da credencial controla em quais partes de uma requisição de saída o segredo é substituído. É um objeto opcional, irmão de networking, com dois campos booleanos: header (cabeçalhos de requisição) e body (corpo da requisição). injection_location é independente de networking.allowed_hosts: allowed_hosts define o escopo de para quais hosts o segredo é substituído, e injection_location define o escopo de em quais partes da requisição ele é substituído.
injection_location se comporta de forma diferente na criação e na atualização:
| Operação | Comportamento de injection_location |
|---|---|
| Criar credencial | Se você fornecer o objeto, qualquer campo que você omitir dentro dele assume o padrão false: {"header": true} cria uma credencial somente de cabeçalho. Omita o objeto inteiramente e ambas as localizações são habilitadas. |
| Atualizar credencial | Os campos são mesclados individualmente: {"body": false} desabilita a substituição no corpo e deixa header inalterado. |
Uma credencial deve ter pelo menos uma localização habilitada, então uma criação ou atualização que desabilitaria ambas as localizações retorna um erro 400. Passar um null explícito para o objeto injection_location ou para qualquer um dos campos também retorna um erro 400 ("omita o campo em vez disso"). A resposta sempre retorna ambos os campos com seus valores resolvidos.
Um placeholder em uma localização desabilitada não é nem substituído nem removido. A requisição é enviada ao terceiro com a string literal do placeholder opaco naquela localização. Se uma requisição chega ao terceiro contendo a string literal do placeholder, ou aquela localização está desabilitada para a credencial ou o host de destino não está coberto pelo networking.allowed_hosts da credencial.
A substituição acontece na saída, não dentro do sandbox. Qualquer coisa que processe a credencial localmente vê o placeholder opaco, não o valor real: clientes que validam o formato da credencial na inicialização podem rejeitá-la, e clientes que computam uma assinatura de requisição a partir do segredo (por exemplo, AWS SigV4) produzem uma assinatura inválida. Credenciais de variável de ambiente funcionam para clientes que enviam o valor do segredo literalmente em uma requisição de saída, em uma localização que o injection_location da credencial habilita.
A substituição é apenas de saída. Se um cliente usa o segredo armazenado para buscar um token de sessão (por exemplo, uma concessão de credenciais de cliente OAuth), o token retornado chega ao sandbox sem redação. Para fluxos baseados em troca, realize a troca você mesmo e armazene o token resultante no vault em vez disso.
As credenciais são armazenadas como fornecidas e não são validadas até o tempo de execução da sessão. Uma credencial inválida aparece como um erro de autenticação ou erro downstream durante a sessão, que é emitido mas não bloqueia a continuação da sessão.
Restrições:
- Chave única por vault.
mcp_server_url(credenciais MCP) esecret_name(credenciais de variável de ambiente) devem ser únicos entre as credenciais ativas em um vault. Criar uma duplicata retorna um 409. - Chaves são imutáveis. Para alterar
mcp_server_urlousecret_name, arquive a credencial e crie uma nova. - Máximo de 20 credenciais por vault.
Referenciar o vault na criação da sessão
Passe vault_ids ao criar uma sessão:
session = client.beta.sessions.create(
agent=agent.id,
environment_id=environment.id,
vault_ids=[vault.id],
title="Alice's Slack digest",
)Comportamento em tempo de execução:
- Quando nenhuma credencial MCP corresponde por
mcp_server_url, a conexão é tentada sem autenticação e resultará em erro se o servidor exigir autenticação. - Quando múltiplos vaults contêm uma credencial correspondente, o primeiro vault com uma correspondência vence.
- Em sessões multiagente, as credenciais do vault se aplicam a cada thread. Um agente cuja própria definição declara o servidor MCP correspondente autentica com essas credenciais. Consulte Conectar agentes a servidores MCP.
Rotacionar uma credencial
Valores de segredo, display_name e (em credenciais de variável de ambiente) injection_location podem ser atualizados. As atualizações de injection_location são mescladas por campo, conforme descrito na aba Environment variable de Adicionar uma credencial. Para uma sessão em execução, uma atualização de injection_location se propaga da mesma forma que uma rotação de segredo: as credenciais da sessão são re-resolvidas sem reinicialização, conforme descrito em Ciclo de vida da credencial, e as localizações atualizadas se aplicam às requisições de saída subsequentes da sessão. Campos estruturais (mcp_server_url, secret_name, token_endpoint, client_id) são bloqueados após a criação. Para alterá-los, arquive a credencial e crie uma nova.
client.beta.vaults.credentials.update(
credential.id,
vault_id=vault.id,
auth={
"type": "mcp_oauth",
"access_token": "xoxp-new-...",
"expires_at": "2099-12-31T23:59:59Z",
"refresh": {"refresh_token": "xoxe-1-new-..."},
},
)Ciclo de vida da credencial
As credenciais são re-resolvidas periodicamente, tanto durante uma sessão quanto durante o ciclo de vida do vault. Isso garante que a rotação, arquivamento ou exclusão de credenciais se propague para sessões em execução sem reinicialização.
Para ser notificado se uma credencial for arquivada, excluída ou falhar ao atualizar, você pode se inscrever nos webhooks de vault e credencial associados a essas mudanças de ciclo de vida.
| Evento | Gatilho |
|---|---|
vault.archived | Vault arquivado. Um evento vault_credential.archived também é emitido para cada credencial subjacente. |
vault.deleted | Vault excluído. Um evento vault_credential.deleted também é emitido para cada credencial subjacente. |
vault_credential.archived | Credencial arquivada, seja diretamente ou como resultado do arquivamento do vault. |
vault_credential.deleted | Credencial excluída, seja diretamente ou como resultado da exclusão do vault. |
vault_credential.refresh_failed | Uma credencial mcp_oauth não pode ser atualizada (refresh token inválido ou erro irrecuperável do servidor OAuth). |
Para credenciais mcp_oauth, a re-resolução também atualiza o token de acesso se ele tiver expirado. Se a atualização falhar, um evento vault_credential.refresh_failed é emitido.
Diagnosticar uma falha de atualização OAuth
Para diagnosticar por que uma atualização falhou, chame POST /v1/vaults/{vault_id}/credentials/{credential_id}/mcp_oauth_validate (ou client.beta.vaults.credentials.mcp_oauth_validate(...) no SDK). Isso permite que você decida como lidar com a falha; a ação correta depende do tipo de erro.
O status de nível superior informa o que fazer a seguir:
valid: o token funciona; nenhuma ação necessária.invalid: a concessão desapareceu ou o servidor OAuth rejeitou a atualização com um 4xx. Solicite ao usuário final que reautorize.unknown: um erro transitório (5xx, 429 ou falha de rede). Aguarde e tente novamente.
validation = client.beta.vaults.credentials.mcp_oauth_validate(
credential.id,
vault_id=vault.id,
)
print(validation.status) # "valid", "invalid", or "unknown"A resposta é um objeto vault_credential_validation. mcp_probe inclui a etapa de handshake MCP que falhou; refresh inclui o resultado da atualização tentada.
{
"type": "vault_credential_validation",
"credential_id": "vcrd_01ABC...",
"vault_id": "vlt_01XYZ...",
"validated_at": "2026-04-29T17:12:00Z",
"has_refresh_token": false,
"status": "invalid",
"mcp_probe": {
"method": "initialize",
"http_response": {
"status_code": 401,
"content_type": "application/json",
"body": "{\"error\":\"invalid_token\"}",
"body_truncated": false
}
},
"refresh": {
"status": "no_refresh_token",
"http_response": null
}
}Outras operações
- Listar vaults ou credenciais: Paginado, mais recentes primeiro. Registros arquivados são excluídos por padrão (passe
include_archived=truepara incluí-los). - Arquivar um vault:
POST /v1/vaults/{id}/archive. Cascateia para todas as credenciais. Os segredos são expurgados; os registros são retidos para auditoria. Sessões futuras que referenciam este vault falham; sessões em execução continuam. - Arquivar uma credencial:
POST /v1/vaults/{id}/credentials/{cred_id}/archive. Expurga o payload do segredo; a chave da credencial (mcp_server_urlousecret_name) permanece visível e é liberada para uma credencial de substituição. - Excluir um vault ou credencial: Exclusão permanente. O registro não é retido. Use arquivamento se você precisar de uma trilha de auditoria.
Was this page helpful?