axm-vault
Catalog-resolver secrets manager (keyring + SecretStr) for AXM
Installation
Quick Start
Declare the credentials a package needs — the catalog describes schema only, keep real secrets out of its defaults and descriptions:
Python
from axm_vault import CredentialGroup, CredentialSpec
group = CredentialGroup(
id="acme",
package="axm-acme",
title="Acme",
specs=(CredentialSpec(name="api_key", env="ACME_API_KEY", kind="token"),),
)
spec = group.spec("api_key") # -> CredentialSpec(name='api_key', ...)
The isolated tutorial resolves a synthetic value
using a temporary config home and an explicitly selected in-memory keyring.
A local group is accepted by Resolver.resolve; get and bind require a
registered provider.
Features
- ✅ Value-less catalog — models describe schema; default strings must not contain real secrets
- ✅ Entry-point discovery —
load_catalog()aggregatesaxm.credentialsgroups (empty-safe, cached) - ✅ External authentication state — value-less dependencies report
CONNECTED,DISCONNECTED, orTOOL_ABSENTwithout exposing tokens - ✅ Layered resolution —
Resolverwalksenv > file > keyring > default > prompt; file tier delegated toaxm-config, keyring only forSECRET - ✅ Typed binding —
bind(model, group)builds a pydantic model from resolved values,SECRETfields asSecretStr - ✅ Value-free doctor —
doctor_data()/vault_doctorreport each credential's{layer, present}provenance per declared instance and surface skipped malformed contributions, without ever returning a secret - ✅ MCP tools —
vault_doctor(provenance),vault_set(keyring/config), andvault_delete(keyring removal) ship asaxm.tools(MCP + CLI + DAG node) - ✅ Operator CLI —
axm-vaultexposessetup/get/set/rotate/delete/doctor/path; interactivesetupis TTY-guarded and idempotent,getmasks secrets unless--reveal - ✅ Frozen & strict — immutable pydantic v2 models that forbid unknown fields
- ✅ Modern Python — 3.12+ with strict typing