Your agent creates a one-time link. The user fills the form.
Credentials go straight to your secret store.
The agent only sees { status: "ok" }.
Agent ZeroCreds User │ │ │ ├─POST /api/session/create──►│ │ │ {fields, destination} │ │ │◄─{url, expires_at}─────────┤ │ │ │ │ ├─send URL (TG / email)─────────────────────────────────►│ │ │ │ │ │◄─GET /f/{token}───────────┤ │ │──form html────────────────►│ │ │◄─POST {credentials}────────┤ │ │ │ │ ├─write to secret store │ │ │ │ ├─GET /session/{t}/status────►│ │ │◄─{ status: "done" }──────────┤ │ │ │ │ │ never saw credentials │ │
curl -X POST https://zerocreds.com/api/session/create \ -H "Authorization: Bearer YOUR_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "title": "Connect GitHub", "description": "Paste your token with repo scope", "fields": [ {"name":"token","label":"Personal Access Token","type":"password"} ], "destination": "prod-gcp" }' ← { "url": "https://zerocreds.com/f/8a3f…" } # send url to the user → wait → poll: curl https://zerocreds.com/api/session/8a3f…/status \ -H "Authorization: Bearer YOUR_TOKEN" ← { "status": "done" } ✓ never saw the password
Credentials POST directly to ZeroCreds — never through your agent or LLM context.
When the user submits, you get { status: "done" } and the values are
already in your configured secret store.
# ~/.claude/settings.json { "mcpServers": { "zerocreds": { "command": "npx", "args": ["-y", "zerocreds-mcp"], "env": { "ZEROCREDS_TOKEN": "your-token-here" } } } } # Then Claude Code calls the tool directly: zerocreds.collect_credentials({ title: "Connect GitHub", fields: [{ name: "token", type: "password" }], destination: "local-dev" }) ← { status: "done" } credentials in ~/agent-tokens/
Add ZeroCreds as an MCP server. Claude Code picks up the tool automatically — no manual HTTP calls, no token handling in your prompt.
Claude creates the session, waits for the user, and continues the task once { status: "done" } comes back. The credential values stay out of the conversation context entirely.
ZeroCreds uses roles/secretmanager.secretVersionAdder — it can push a new version but physically cannot read any secret back. Enforced by IAM, not code.
IAM policy grants only secretsmanager:PutSecretValue on a specific ARN. GetSecretValue is never in the policy — write-only by construction.
Vault policy allows create and update capabilities on the target path. read is simply omitted — Vault enforces it at the policy layer.
Simplest option for local agents. Credentials are written as JSON to ~/agent-tokens/{uid}/{name} with mode 0600. No external dependency.
A security specialist can check the exact git commit running on your server via /version,
match it to the public source code, and verify line by line what happens to user input.
Get a token in 30 seconds on zerocreds.com, or deploy on your own server for full control. MIT licensed — audit the code, fork it, run it anywhere.
We'll configure ZeroCreds for your stack — destinations, agent integration, the works.
Anyone can verify the running server at any time.
GET https://zerocreds.com/version returns the git commit hash.
Match it to the source on GitHub. Line by line.