Five interfaces, each deliberately narrow.
Every integration surface exposes less than the CLI. The MCP server cannot read raw items, the browser extension never receives a vault bearer, and sync moves ciphertext only.
Loopback HTTP broker#
skarbiec serve exposes the public /v1 API on 127.0.0.1 only. Acquisition is the default machine path: POST /v1/acquisitions with X-Consumer and the proof fields, then POST /v1/acquisitions/read with the one-time bearer — no standing authorization bearer is sent on the issue request. Direct scopes remain compatibility-only. Any encrypted tunnel, TLS edge, firewall, and service supervision is operator-owned.
MCP server#
The MCP surface is tighter than the CLI. Value-revealing and mutating verbs — item read, mint, rotation, export — are not exposed over MCP at all; health, list, and audit stay available. The compatibility resolve path stays disabled until the server process is configured through its own environment (SKARBIEC_MCP_CONSUMER, SKARBIEC_MCP_TOKEN_FILE, SKARBIEC_MCP_OUT_DIR), writes a mode-0600 env file, and returns only the path and exported variable names — never values, and never a token as a tool argument.
Browser bridge#
The managed Chrome extension never receives a vault bearer, owner key, or recovery key. It exchanges length-framed messages with native-host, which alone reads the owner-private token file and calls the loopback API as skarbiec-browser-host with only read:login-* capability. Host matching and the stored login's domain allow-list are checked again by the native host before any value is returned, and the native-messaging manifest accepts only the extension id derived from the release signing key.
Capability routes#
A workload never names a vault item. It asks the broker for a resource — origin:https://dash.cloudflare.com/password, provider:openai, agent:wisent-app — and the routes table turns that name into one item and one field. A resource the table does not carry is refused rather than guessed; an operator, not a workload, decides what a resource stands for. routes verify resolves every route the way redemption does and exits non-zero when any of them cannot deliver. A row also records the item's immutable identifier when the item carries one, so a route whose item name no longer resolves is reported as renamed, naming where the item went, rather than collapsing a rename and a purge into one sentence.
skarbiec routes add --resource origin:https://dash.cloudflare.com/password \
--item platform-admin-cloudflare --field password \
--reason 'same login form, password field'
skarbiec routes verify dash.cloudflare.com
# -> { "checked": 2, "broken": [] }Synchronization and the Stado adapter#
All synchronization moves the encrypted vault document or an item sealed to the destination owner — it never merges two whole vault files and never replicates plaintext. Git sync (sync-init, sync-push, sync-pull) commits vault.enc.json to an operator-configured remote; serve-channel replication (pull, enroll, sync-daemon) uses exact sync:pull and enroll:<uid> grants against a source running skarbiec serve. The Stado adapter preserves exact deployed Wisent consumer/item contracts over the broker as a compatibility interface outside the core binary. Everything runs against the local broker: decryption happens only on the owner host, so integrations are available exactly when that host can decrypt. Supported release targets are darwin-arm64 and linux-amd64; runtime dependencies are gpg, openssl, shasum, and oathtool (TOTP only).
Support#
Community help lives on the Wisent Discord and in GitHub Discussions; bugs and feature requests go to GitHub Issues on wisent-ai/skarbiec. Security reports use a private GitHub Security Advisory, never a public issue. Stuck readers end here on purpose: every docs tail closes with where to go next.