The password manager for AI agents. An authenticated proxy that stores credentials and injects them on matching requests — agents never see raw secrets.
Website · Getting Started · Security Model
Agent ──▶ proxy.agent.pw/api.github.com/user ──▶ api.github.com/user
(Proxy-Authorization) (credential injected)
- Agent sends a normal HTTP request through the proxy
- agent.pw looks up a stored credential for the target host
- If found, inject auth headers and forward
- If not found, return a structured
WWW-Authenticate: AgentPW ...challenge that points the caller at an OAuth or manual bootstrap flow - Agents get scoped, revocable Biscuit tokens — and server-minted tokens are tracked for listing, revocation, and usage metadata
- Authenticated proxy — credential injection by target hostname, transparent to the agent
- Structured auth bootstrap — standards-based OAuth discovery (RFC 9728, PKCE, Resource Indicators), with
AgentPWauth challenges and manual/profile fallback for non-standard APIs - Credential profiles — templates that describe how to authenticate with a service (OAuth endpoints or header forms)
- Path-based access — credentials and profiles live in a hierarchical tree, with explicit rights over descendant roots (details)
- Tracked Biscuit tokens — cryptographic attenuation by host, method, path, root, and TTL, with tracked server-minted tokens that can be listed and revoked by ID (details)
- Token stack —
token push,token pop,token list, andtoken revokefor temporary privilege narrowing during agent tasks - Write-only credentials — agents use credentials through the proxy but cannot read the raw secret material
- Local-first OSS — run a self-hosted instance with PGlite in one command, then use the hosted vault as an optional browser shell
npx agent.pw startThat command:
- creates
~/.agent.pw/ - writes daemon state to
~/.agent.pw/server.json - writes CLI connection state to
~/.agent.pw/cli.json - initializes a local PGlite database
- mints a local root token for the CLI
- installs a local background service
- offers to install the optional Smithery
agentpwskill - opens agent.pw/vault already connected to your local instance
The hosted vault is optional. Your local daemon is the source of truth, and you can keep working entirely through the CLI.
Running start again is safe: it repairs server.json, refreshes cli.json, and re-registers the local service if needed.
Add a credential profile and use the proxy:
agent.pw profile add linear --host api.linear.app \
--auth headers \
-H "Authorization: Bearer {api_key:Your Linear API key from Settings > API}"
agent.pw cred add linear
agent.pw curl http://localhost:9315/proxy/api.linear.app/graphql \
-d '{"query":"{ issues { nodes { id title } } }"}'The local daemon can also act as a standard forward proxy for loopback clients:
export HTTP_PROXY=http://127.0.0.1:9315
export HTTPS_PROXY=http://127.0.0.1:9315- Plain HTTP proxy-form requests are rewritten into the normal
agent.pwproxy flow, so stored credentials can still be injected. CONNECTrequests are authenticated, policy-checked, and tunneled directly to the target host.- Because
CONNECTcarries opaque TLS bytes after the tunnel is established, agent.pw cannot inject HTTPS headers inside aCONNECTtunnel without full TLS interception. - Non-loopback clients should still send
Proxy-Authorizationexplicitly. The proxy accepts bothBearer <token>and standard Basic proxy credentials.
agent.pw status
agent.pw logs
agent.pw stopMint, list, and revoke tracked proxy tokens:
agent.pw token push --host api.linear.app --method GET --path /graphql --ttl 1h
agent.pw token list
agent.pw token revoke <issued-token-id> --reason "rotated in CI"ALL /proxy/{hostname}/{path...} authenticated proxy
GET /credentials list credentials
PUT /credentials/{name} store a credential
PATCH /credentials/{name} move a credential to a new path
DELETE /credentials/{name} remove a credential
GET /cred_profiles list profiles
GET /cred_profiles/{slug} fetch profile details
PUT /cred_profiles/{slug} create/update a profile
DELETE /cred_profiles/{slug} remove a profile
POST /tokens mint a tracked Biscuit token
GET /tokens list tracked tokens
GET /tokens/{id} fetch tracked token metadata
POST /tokens/inspect inspect token facts
DELETE /tokens/{id} revoke a tracked token
GET /.well-known/jwks.json Ed25519 public key (JWK)
Management routes use Authorization: Bearer <token>. Proxy requests use Proxy-Authorization.
List endpoints accept limit and cursor query params and return:
{
"data": [],
"hasMore": false,
"nextCursor": null
}Some credential and profile mutations also require host, profile, or path fields so the server can resolve the exact record or target path.
pnpm install
pnpm build # typecheck root package + bundle the CLI package
pnpm test # run tests (in-memory PGlite)
pnpm run lint # lint
pnpm run db:generate # generate Drizzle migrations from schema changespackages/
server/src/ @agent.pw/server — proxy, credential store, tokens, routes
cli/src/ agent.pw CLI — local start flow, service controls, and management commands
docs/
security-model.md Biscuit tokens, path-based access model, revocation
FSL-1.1-MIT — converts to MIT after two years.