使用 vault 進行驗證
在建立 session 時註冊每位使用者的憑證。
Vault(保管庫)與 credential(憑證)是驗證基本元件,讓您只需為第三方服務註冊一次憑證,之後在建立 session 時即可透過 ID 參照它們。這表示您不需要自行運行機密儲存庫、在每次呼叫時傳送權杖,也不會搞不清楚代理是代表哪位終端使用者執行操作。
Vault 參照是每個 session 的參數,因此您可以在 agent 資源的粒度管理您的產品,並在 session 資源的粒度管理您的使用者。
建立 vault
Vault 是與某位終端使用者相關聯的 credentials 集合。請為它指定 display_name,並可選擇性地以 metadata 加上標記,以便您將其對應回您自己的使用者記錄。
vault = client.beta.vaults.create(
display_name="Alice",
metadata={"external_user_id": "usr_abc123"},
)
print(vault.id) # "vlt_01ABC..."回應為完整的 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
}新增憑證
支援兩種憑證類別:
- MCP 憑證(
mcp_oauth、static_bearer):每個憑證以mcp_server_url作為鍵。當代理在 session 執行期間連線至該 URL 的伺服器時,權杖會自動注入。 - 環境變數(
environment_variable):每個憑證以secret_name(環境變數名稱)作為鍵,並以不透明的佔位符形式儲存在沙箱中。當代理發起對外請求時,不透明佔位符會在出口處被替換為真正的機密。代理永遠不會看到機密值。任何透過環境變數進行驗證的服務都可使用此方式,例如 CLI、SDK 或直接的 API 呼叫。
您提供的實際憑證值(token、access_token、refresh_token、client_secret、secret_value)會被視為敏感的唯寫欄位,永遠不會在 API 回應中傳回。
當 MCP 伺服器使用 OAuth 2.0 時,請使用 mcp_oauth。如果您提供 refresh 區塊,Anthropic 會在存取權杖過期時代您重新整理。
refresh.token_endpoint_auth.type 欄位指示如何驗證重新整理呼叫:
none:公開用戶端client_secret_basic:使用用戶端密鑰的 HTTP Basic 驗證client_secret_post:將用戶端密鑰放在 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..."},
},
},
)請將 refresh.token_endpoint 設定為核發重新整理權杖之 OAuth 流程的權杖端點,因為 Anthropic 會將每個重新整理請求傳送到該 URL,且該欄位在憑證建立後無法變更。
當 MCP 伺服器接受固定的 bearer 權杖(API 金鑰、個人存取權杖或類似項目)時,請使用 static_bearer。不需要重新整理流程。
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",
},
)使用 environment_variable 透過環境變數向外部服務進行驗證,例如 CLI、SDK 或直接的 API 呼叫。環境變數憑證適用於在對外請求中逐字傳送機密值的用戶端,因此在設定之前,請先查看本分頁中的用戶端適用條件。
networking.allowed_hosts 陣列控制機密可以被替換用於哪些對外主機。請使用 "type": "limited" 搭配特定清單,或者如果呼叫端會連線至您無法事先列舉的網域,則使用 "type": "unrestricted"。
基於安全考量,強烈建議限制網域,這可防止您的金鑰被分享給未經授權的主機。
選用的 injection_location 欄位限定機密被替換的位置;完整語意說明於範例之後。
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: False請求酬載通常是由代理正在處理的內容組合而成,因此請求主體是較廣的暴露面。大多數服務從請求標頭讀取 API 金鑰,因此僅啟用 header 是較窄的設定。它將該憑證的替換範圍限定於請求標頭值。
憑證的 injection_location 控制機密會被替換到對外請求的哪些部分。它是一個選用物件,與 networking 同層級,具有兩個布林欄位:header(請求標頭)與 body(請求主體)。injection_location 與 networking.allowed_hosts 彼此獨立:allowed_hosts 限定機密會被替換用於哪些主機,而 injection_location 限定機密會被替換到請求的哪些部分。
injection_location 在建立與更新時的行為不同:
| 操作 | injection_location 行為 |
|---|---|
| 建立憑證 | 如果您提供該物件,物件內省略的任何欄位預設為 false:{"header": true} 會建立僅限標頭的憑證。完全省略該物件則兩個位置皆啟用。 |
| 更新憑證 | 欄位個別合併:{"body": false} 會停用主體替換,並保持 header 不變。 |
憑證必須至少啟用一個位置,因此會導致兩個位置皆停用的建立或更新操作會傳回 400 錯誤。為 injection_location 物件或其中任一欄位傳入明確的 null 也會傳回 400 錯誤(「請改為省略該欄位」)。回應一律會傳回兩個欄位及其解析後的值。
位於已停用位置的佔位符既不會被替換也不會被移除。請求會以該位置中的字面不透明佔位符字串傳送至第三方。如果抵達第三方的請求包含字面佔位符字串,則表示該憑證的該位置已停用,或目的地主機未涵蓋於該憑證的 networking.allowed_hosts 中。
替換發生在出口處,而非沙箱內部。任何在本機處理憑證的程式看到的都是不透明佔位符,而非真實值:在啟動時驗證憑證格式的用戶端可能會拒絕它,而根據機密計算請求簽章的用戶端(例如 AWS SigV4)會產生無效的簽章。環境變數憑證適用於在對外請求中、於憑證的 injection_location 所啟用的位置逐字傳送機密值的用戶端。
替換僅限對外方向。如果用戶端使用儲存的機密來取得 session 權杖(例如 OAuth client-credentials 授權),傳回的權杖會以未遮蔽的形式抵達沙箱。對於基於交換的流程,請自行執行交換,並改為將產生的權杖儲存在 vault 中。
憑證會依所提供的內容儲存,直到 session 執行期間才會進行驗證。無效的憑證會在 session 期間以驗證錯誤或下游錯誤的形式呈現,該錯誤會被發出,但不會阻止 session 繼續進行。
限制條件:
- 每個 vault 內鍵必須唯一。
mcp_server_url(MCP 憑證)與secret_name(環境變數憑證)在 vault 內的有效憑證之間必須唯一。建立重複項目會傳回 409。 - 鍵不可變更。 若要變更
mcp_server_url或secret_name,請封存該憑證並建立新的憑證。 - 每個 vault 最多 20 個憑證。
在建立 session 時參照 vault
建立 session 時傳入 vault_ids:
session = client.beta.sessions.create(
agent=agent.id,
environment_id=environment.id,
vault_ids=[vault.id],
title="Alice's Slack digest",
)執行期行為:
- 當沒有 MCP 憑證依
mcp_server_url相符時,會嘗試以未驗證的方式連線,若伺服器要求驗證則會發生錯誤。 - 當多個 vault 包含相符的憑證時,以第一個相符的 vault 為準。
- 在多代理 session 中,vault 憑證適用於每個執行緒。自身定義中宣告了相符 MCP 伺服器的代理會使用這些憑證進行驗證。請參閱將代理連線至 MCP 伺服器。
輪替憑證
機密值、display_name 以及(環境變數憑證上的)injection_location 可以更新。injection_location 的更新會依欄位合併,如新增憑證的「環境變數」分頁所述。對於執行中的 session,injection_location 的更新會以與機密輪替相同的方式傳播:session 的憑證會在不重新啟動的情況下重新解析,如憑證生命週期所述,而更新後的位置會套用至該 session 後續的對外請求。結構性欄位(mcp_server_url、secret_name、token_endpoint、client_id)在建立後即鎖定。若要變更它們,請封存該憑證並建立新的憑證。
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-..."},
},
)憑證生命週期
憑證會定期重新解析,無論是在 session 期間還是在 vault 生命週期期間。這可確保憑證的輪替、封存或刪除能在不重新啟動的情況下傳播至執行中的 session。
若要在憑證被封存、刪除或重新整理失敗時收到通知,您可以訂閱與這些生命週期變更相關聯的 vault 與憑證 webhook。
| 事件 | 觸發條件 |
|---|---|
vault.archived | Vault 已封存。同時會為每個底層憑證發出 vault_credential.archived 事件。 |
vault.deleted | Vault 已刪除。同時會為每個底層憑證發出 vault_credential.deleted 事件。 |
vault_credential.archived | 憑證已封存,無論是直接封存或因 vault 封存所致。 |
vault_credential.deleted | 憑證已刪除,無論是直接刪除或因 vault 刪除所致。 |
vault_credential.refresh_failed | mcp_oauth 憑證無法重新整理(重新整理權杖無效,或來自 OAuth 伺服器的無法復原錯誤)。 |
對於 mcp_oauth 憑證,重新解析也會在存取權杖過期時重新整理它。如果重新整理失敗,會發出 vault_credential.refresh_failed 事件。
診斷 OAuth 重新整理失敗
若要診斷重新整理失敗的原因,請呼叫 POST /v1/vaults/{vault_id}/credentials/{credential_id}/mcp_oauth_validate(或在 SDK 中使用 client.beta.vaults.credentials.mcp_oauth_validate(...))。這可讓您決定如何處理失敗;正確的處理方式取決於錯誤類型。
頂層的 status 會告訴您下一步該怎麼做:
valid:權杖有效;無需採取任何動作。invalid:授權已不存在,或 OAuth 伺服器以 4xx 拒絕了重新整理。請提示終端使用者重新授權。unknown:暫時性錯誤(5xx、429 或網路失敗)。請稍候並重試。
validation = client.beta.vaults.credentials.mcp_oauth_validate(
credential.id,
vault_id=vault.id,
)
print(validation.status) # "valid", "invalid", or "unknown"回應為 vault_credential_validation 物件。mcp_probe 包含失敗的 MCP 交握步驟;refresh 包含所嘗試之重新整理的結果。
{
"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
}
}其他操作
- 列出 vault 或憑證: 分頁顯示,最新的在前。預設排除已封存的記錄(傳入
include_archived=true以包含它們)。 - 封存 vault:
POST /v1/vaults/{id}/archive。會連帶套用至所有憑證。機密會被清除;記錄會保留以供稽核。未來參照此 vault 的 session 會失敗;執行中的 session 會繼續。 - 封存憑證:
POST /v1/vaults/{id}/credentials/{cred_id}/archive。清除機密酬載;憑證鍵(mcp_server_url或secret_name)仍然可見,並釋出以供替代憑證使用。 - 刪除 vault 或憑證: 硬刪除。記錄不會保留。如果您需要稽核軌跡,請使用封存。
Was this page helpful?