/v1/skills/cli. This page is a reference for understanding what happens under the hood.
Bearer token
Every request an agent makes to Agent Vault requires a bearer token. How the agent gets one depends on how it connects:
Both methods deliver the same core connection details:
Session types
There are two session types:- Vault-scoped sessions — created by
agent-vault vault run. The vault is embedded in the session. No extra headers needed. - Instance-level agent tokens — created via
agent-vault agent create. The agent must include anX-Vaultheader on/discoverand/v1/proposalsrequests to select which vault to use.
The X-Vault header
Instance-level agent tokens must includeX-Vault: {vault_name} on /discover and /v1/proposals requests:
agent-vault vault run do not need this header — the vault is embedded in the session token.
Discover services
Before making any proxied request, the agent calls/discover to learn which hosts have credentials configured in the vault.
The
X-Vault header is required for instance-level agent tokens. Vault-scoped sessions (from vault run) can omit it.Response
serviceslists the services the agent can reach through Agent Vault (each entry hasnameandhost;hostcarries the joined inline form, so a path-scoped service shows up as e.g.slack.com/api/*). Requests to any other host go direct. When two services share the same bare host but scope to different paths (e.g. Slack here), distinguish them bynamein subsequent operations.available_credentialslists credential key names in the vault (values are never exposed). Agents use these to avoid creating duplicate slots in proposals.
Route requests through HTTPS_PROXY / HTTP_PROXY
The canonical way for an agent to reach an upstream host is to call the real URL directly.agent-vault vault run pre-configures HTTPS_PROXY/HTTP_PROXY and the CA trust chain on the child process, so every standard HTTP client — curl, fetch, requests, axios, the Go stdlib, SDKs like stripe-node, CLIs like gh and stripe — transparently routes through the broker. Agent Vault intercepts the CONNECT (for https:// upstreams) or the absolute-form forward-proxy request (for http:// upstreams), matches the target host against the vault’s services, and injects the stored credential into the auth header for that service. Other client headers (vendor headers like anthropic-version, tracing IDs, etc.) flow through unchanged — see Header forwarding for the precise rules.
Authorization header. No credential in the code.
Environment set by vault run
Propose changes
When an agent needs access to a service that is not in the vault’s services, it creates a proposal. Each proposal bundles services (host access) and credential slots (credentials the human provides at approval time).approval_url that the agent presents to the user:
Response (201)
GET /v1/proposals/{id} until the status changes from pending (every 3s for the first 30s, then every 10s). Once applied, the agent retries its original request.
See Proposals for the full proposal lifecycle, including storing credentials back and removing access.
Error handling
Path-based service matching changed how request log rows are filtered. The
matched_service field in GET /v1/vaults/{vault}/logs rows holds the canonical service name for new rows; rows written before the upgrade still carry the matched host. Operators querying ?service= should use the slug for new rows and the host for old rows. The matched service’s host pattern is not returned in log rows — recover it by listing GET /v1/vaults/{vault}/services and filtering by name, or reading /discover.Security constraints
- Never extract, log, or display credential values
- Never hardcode tokens. Always read from
AGENT_VAULT_TOKEN. - Only reach hosts returned by
/discover. For unlisted hosts, create a proposal. - If a
credential_not_founderror occurs, inform the user which key is missing.

