Install
openclaw skills install @zmtucker/keeper-credentialsSecurely broker user-authorized Keeper vault credentials into agent-to-agent conversations using scoped access and zero-knowledge encryption.
openclaw skills install @zmtucker/keeper-credentialsThis skill turns a user-facing agent into a credential broker: the user authorizes the agent against their Keeper vault once, and the agent can then fetch scoped credentials and hand them to other agents (service agents / drive thrus on the Knoxville platform) to fulfil a request — e.g. "book this with my airline login", "pull my order from the vendor's agent".
It uses Keeper Secrets Manager (KSM), which is:
Note on auth model: Keeper's only OAuth/SSO login is Commander/full-vault, which this skill intentionally does not use. KSM's "user completion" step is the one-time token bootstrap below. If you genuinely need full-vault, OAuth/SSO login, that's a different (heavier, broader-access) integration.
The user does this once in their Keeper Web Vault (or Commander):
US:BASE64...; the prefix is the region).Then the agent binds the device:
KEEPER_KSM_TOKEN='US:ONE_TIME_TOKEN' python3 scripts/keeper_creds.py init
# or
python3 scripts/keeper_creds.py init --token 'US:ONE_TIME_TOKEN'
init exchanges the token for a local ksm-config.json (app key + EC private
key + client id) under KEEPER_SKILL_HOME. The token is single-use — after
this, the config authenticates and the token is dead. Persist
KEEPER_SKILL_HOME across sessions and every future session is silent.
python3 scripts/keeper_creds.py status # silent check the config still works
python3 scripts/keeper_creds.py list # what credentials are available (NO values)
list returns each record's uid, title, type, and the names of its
fields/custom fields/files — never the secret values. Use it to pick the right
record before delivering it.
This is the core workflow. The skill prepares the credential; the agent
delivers it using the Knoxville MCP tools (start_conversation /
start_agent_conversation → send_message). The skill never calls those
tools itself — that keeps the secret-handling boundary clean.
Pick a delivery mode (most → least secure):
| Mode | What's sent to the peer | Secret in transcript? | Needs |
|---|---|---|---|
share | A One-Time Share link (time-limited, single-use) | No — value is out of band | Commander (KEEPER_COMMANDER_CONFIG) |
reference | A Keeper Notation ref (keeper://UID/field/...) | No — peer resolves it itself | Peer has its own KSM access to the folder |
inline | The raw value(s) in the message | Yes | nothing (but confirm with user) |
Build the payload:
# Preferred: one-time share link
python3 scripts/keeper_creds.py package "Acme Airline" --mode share --expire 30m \
--purpose "to book the flight you requested"
# Pure-KSM, no Commander, if the peer is also Keeper-aware
python3 scripts/keeper_creds.py package <UID> --mode reference --field password
# Last resort, value in the message — confirm with the user first
python3 scripts/keeper_creds.py package <UID> --mode inline
package returns { "payload": ..., "suggested_message": ..., "_sensitive": ... }.
The agent then sends suggested_message (or its own wording wrapping
payload) to the peer:
start_conversation(slug=...) -> conversation_id
send_message(conversation_id, content=<suggested_message>)
Lower-level building blocks if you need them:
python3 scripts/keeper_creds.py share <UID> --expire 1h # just the OTS link
python3 scripts/keeper_creds.py get <UID> --field password # just the value (sensitive)
python3 scripts/keeper_creds.py notation 'keeper://UID/field/password'
list.share (One-Time Share). It's the only mode where the raw secret
never enters either agent's transcript or logs.inline. Putting a real credential in a message is a
disclosure to the receiving agent and its operators. Get explicit user
go-ahead, name the exact record, and prefer short-lived/secondary creds.ksm-config.json contents, tokens, or secret values.
The scripts write the config 0600 and list/status never emit values.status returns reauth_required, the Application/folder share was
likely revoked — ask the user to re-run the bootstrap; don't work around it.references/ksm_auth_and_storage.md —
how the KSM token→config bootstrap and cross-session persistence work.references/delivery_modes.md — the three
delivery modes, the Commander One-Time Share bridge, and the agent-to-agent
orchestration with the Knoxville MCP tools.