Proposal is a request from an agent to add, update, or remove credentials and services within a specific vault.
Each Proposal must be approved by a member of the vault with sufficient permissions in order for changes to take effect.
Each Proposal may include:
- Services: Host access changes that define which services the agent wants to reach and how Agent Vault should authenticate to them. These merge into the vault’s services on approval. For example, a service entry might grant access to
api.stripe.comusing a bearer token. - Credential slots: Credential operations covering keys the agent needs a human to supply, values the agent wants to store back, or credentials to delete. For example, a credential slot might ask the human to provide a
STRIPE_KEYat approval time. - Messages: A developer-facing
messageand a human-facinguser_messageshown on the browser approval page.
Lifecycle
Every proposal moves through a simple state machine:Approve proposals
- Browser
- CLI
When an agent needs access to a service, it shares an approval link in chat (e.g.
http://localhost:14321/approve/3?token=av_appr_...).Click the link
The approval token grants read access to the proposal details: requested services, credential slots, and the agent’s message. Token TTL: 24 hours.
Log in if needed
Submitting the approval requires a valid Agent Vault session. If you’re not logged in, the page shows an inline login form first.
Reject proposals
- Browser
- CLI
The browser approval page includes a Deny option alongside the approval
form.
List and inspect
review command presents each pending proposal one by one. For each, choose Approve, Reject, Skip, or Quit. At the end, a summary shows the count and IDs of approved, rejected, and skipped proposals.
How agents raise proposals
Agents handle this flow automatically. This section describes what happens
under the hood.
/discover, the response includes a proposal_hint with the denied host and the endpoint to create a proposal. The agent then sends:
approval_url that the agent presents to the user in chat.
Actions
Each service and credential slot carries anaction field:
set: idempotent upsert (add or replace). Services requirename+host+auth— pick thenamedeliberately, the server does not derive one fromhost— and credential slots requirekey. To layer two credentials on the same host, give each entry its ownnameand embed different inline path globs inhost(e.g.slack.com/api/*vsslack.com/api/apps.connections.*).delete: remove an existing entry. Services delete byname(canonical); whennameis omitted, the server resolves uniquely againsthost— and returns 409 with the candidate names if multiple services share that host. Credential slots only needkey.
Credential slots
A credential slot can work in four ways:| Scenario | type | value field | What happens |
|---|---|---|---|
| Human supplies the credential | static (default) | omitted | Human enters the value at approval time |
| Agent stores a credential back | static | included | Value is encrypted at creation; human confirms at approval |
| OAuth credential | oauth | omitted | Human connects via OAuth or pastes tokens at approval time |
| Delete a credential | n/a | n/a | action: "delete" removes the key |
oauth config object:
authorization_url(optional): if present, approval shows a Connect button for the browser consent flow. If omitted, approval shows token paste fields.token_url(required): the provider’s token endpoint, used for token exchange and refresh.scopes(optional): space-separated permissions to request during the consent flow.client_id(optional): pre-fill the client ID field on the approval page.
value field must not be set for OAuth slots — tokens are obtained through the connect flow or pasted by the human.
Every credential key referenced in a service’s auth config must resolve to either a credential slot in the proposal or an existing credential in the vault. Credential keys use UPPER_SNAKE_CASE format.
Limits
| Constraint | Value |
|---|---|
| Max services per proposal | 10 |
| Max credential slots per proposal | 10 |
| Max pending proposals per vault | 20 |
message length | 2,000 chars |
user_message length | 5,000 chars |
Credential description length | 500 chars |
obtain length | 500 chars |
obtain_instructions length | 1,000 chars |
| Proposal TTL | 7 days |

