Markdown
Reference · v0.5.0 · 2026-08

Current surfaces. Clear boundaries.

Current v0.5.0 surfaces are the local CLI, source ESM library exports, local stdio MCP, remote Streamable HTTP MCP at /mcp, and the hosted sync routes under /v/<slug>/. There is no public REST API or separately published SDK package yet; MCP tools are the agent-facing API. Hosted sync has exactly one write, POST /v/<slug>/devices, which any keypair may call to enrol itself as pending; the rest is reads, and admission is what gates bundles rather than what gates the catalog.

CLI
autovault@0.5.0 npm · brew
Container
autovault:v0.4.0 GHCR
Library
source ESM exports Node/TypeScript
Remote
/mcp Streamable HTTP MCP
Hosted
/v/<slug>/ Ed25519 device-signed

CLI

user-facing local operations

The CLI is the local operator surface. It installs local bundles and remote skill sources, runs the setup wizard, syncs host profiles, audits repositories, resolves capability visibility, inspects installed skills, and starts the remote service when you self-host.

autovault add <source-or-path>

stablesince 0.4.0

Admit a known skill from a local path, GitHub identifier or URL, agentskills slug, or direct HTTPS SKILL.md URL. The command collects sibling resources when available, rejects symlinks, validates, signs, records provenance, and can refresh profile links. Use --agent for remote skills that do not declare target agents, --yes for non-TTY automation, and --provenance to keep the recorded source identifier when replacing a local skill from a staging directory.

$autovault add <source-or-path> [--source github|agentskills|url|local] [--provenance <value>] [--version <v>] [--agent <agent>] [--sync-profiles|--no-sync-profiles] [--discover|--no-discover] [--link agent=/path/to/skills] [--dry-run] [--yes] [--quiet] [--verbose] [--json]
$autovault add ./skills/skill-author --sync-profiles --yes
$autovault add ./staging/skill-author --source local --provenance '<existing-identifier>' --sync-profiles --yes
$autovault add autoworks-ai/autovault:skills/skill-author/SKILL.md --sync-profiles --yes
$autovault add skill-slug --source agentskills --sync-profiles --agent codex --yes
$autovault add https://example.com/SKILL.md --source url --no-sync-profiles --yes

autovault remove <skill-name>

stablesince 0.3.0

Remove a vaulted skill, delete vault-local transforms for that skill, and refresh managed profile links. Native profile-root discovery is on by default, so AutoVault prunes managed symlinks from discovered host roots such as ~/.claude/skills, ~/.codex/skills, and ~/.cursor/skills. Use --no-discover to refresh only the vault's internal profile tree, --link agent=/path for an explicit host root, and --json for automation.

$autovault remove <skill-name> [--discover|--no-discover] [--link agent=/path/to/skills] [--json]

autovault sync-profiles

stablesince 0.2.0

Regenerate local filesystem-native profile links for detected or configured host skill roots. Reports restart_required: true when symlinks change so the operator knows to reload their agent session. Remote mode cannot perform this on client machines.

$autovault sync-profiles [--discover] [--link agent=/path/to/skills]

autovault setup

stablesince 0.2.0

Interactive wizard that scans the vault, the bundled skills root, and any discovered native agent skill roots (~/.claude/skills, ~/.codex/skills, ~/.cursor/skills), then offers a per-skill adoption decision. The wizard requires a TTY; without one it exits with code 2 and a NoTtyError. Re-run any time to re-scan. Three adoption modes: augment (safe default) refreshes profile symlinks only — existing native dirs are not touched; backup renames each native dir to <root>.bak/<name>, admits the bytes into the vault, then replaces the original with a managed symlink (the typical “import my skills” choice); in-place admits the bytes then removes the native dir and replaces with a symlink — destructive, no backup. After adoption the wizard runs sync-profiles, which emits restart_required: true when symlinks change.

$autovault setup [--json] [--review] [--advanced]

autovault doctor

stablesince 0.2.0

Inspect local vault health, installed skill integrity, ignored OS/editor metadata, and profile visibility. --clean removes ignored OS/editor metadata. --repair re-signs unsigned local skills only — it refuses tampered metadata and remote sources. --json emits a structured report with repair_status per skill.

$autovault doctor [skill-name] [--clean] [--repair] [--json]

autovault audit-repo

stablesince 0.2.0

Walk a repository for vendored SKILL.md files, validate each through the same admission gate the vault uses, and emit a report. Useful for CI checks that block merging unsigned or invalid skills.

$autovault audit-repo --repo /path/to/repo [--format json|markdown]

autovault resolve

stablesince 0.2.0

Resolve which skills are visible to a given caller, platform, channel, and query. This exposes the same capability resolution the MCP server runs internally. Output is JSON; --channel is optional, the rest are required.

$autovault resolve --caller <id> --platform <name> [--channel <id>] --query <text>

autovault skill list

stablesince 0.2.0

List installed skills as JSON, with each skill’s declared bin.* action names. Reserved action names (list, search, which) cannot be declared as bin actions.

$autovault skill list

autovault skill which

stablesince 0.2.0

Print the resolved script path(s) for a skill without running them. Verifies the signed manifest before parsing. With <action>, prints the single command/args/cwd for that action; without, prints all declared actions.

$autovault skill which <name> [<action>]

autovault skill <action> <name>

stablesince 0.2.0

Generic dispatch that delegates to the named skill’s bin.<action> handler. The skill’s signed manifest declares which actions exist; list, search, and which are reserved.

$autovault skill <action> <name>

autovault serve

stablesince 0.2.1

Start the remote Streamable HTTP MCP service. Set AUTOVAULT_MODE=remote, AUTOVAULT_PUBLIC_URL, admin credentials, and storage path before exposing it.

$autovault serve

Environment variables

process env · CLI runtime + install script

Two distinct groups. The first is honored by the <code>autovault</code> CLI binary at runtime (parsed in <code>src/config.ts</code>). The second is read only by <code>scripts/install.sh</code> during the initial install; the CLI does not read these.

CLI runtime variables

stablesince 0.2.0

Set these before invoking the autovault CLI or starting autovault serve. Logs are JSON lines on stderr only; stdout is reserved for MCP framing — never write to stdout from server code.

$AUTOVAULT_STORAGE_PATH=~/.autovault autovault doctor
VariableTypeDescription
AUTOVAULT_STORAGE_PATH opt~/.autovaultVault root directory. Default if unset.
AUTOVAULT_DB_PATH opt<storage>/autovault.sqliteOverride the SQLite index location; defaults under the storage path.
AUTOVAULT_MODE optlocal | remotelocal runs the stdio MCP server. Set to remote before autovault serve.
AUTOVAULT_PUBLIC_URL opthttps://<host>Required when running autovault serve behind a reverse proxy. Must match the externally visible URL.
AUTOVAULT_HTTP_PORT opt3000Listen port for the remote MCP service. Some platforms inject PORT instead; check your host.
AUTOVAULT_ALLOWED_ORIGINS optcomma-separatedCORS allowlist for remote mode. Comma-separated origins.
AUTOVAULT_PROFILE_LINKS optagent=/path,…Override discovered profile roots. Comma-separated agent=/path pairs.
AUTOVAULT_SECURITY_STRICT opttrueWhen true (default), security-flag hits block admission. Set false to downgrade them to warnings.
AUTOVAULT_LOG_LEVEL optinfoOne of debug / info / warn / error. JSON-line output on stderr.
AUTOVAULT_SEARCH_MODE opttextSearch backend. Today only text is supported; embedding-backed search is future work.
AUTOVAULT_ADMIN_EMAIL optemailRemote mode: initial admin email. Used by the OAuth bootstrap on first boot.
AUTOVAULT_ADMIN_PASSWORD optstring ≥ 12 charsRemote mode: initial admin password. Hashed on first boot.

Install script variables

stablesince 0.2.0

Read only by scripts/install.sh during the initial install. The autovault binary does not parse these — they shape the installer's interactive flow.

$AUTOVAULT_NO_SETUP=1 curl -fsSL https://autovault.sh | sh
VariableTypeDescription
AUTOVAULT_NO_SETUP opt1Skip launching the setup wizard at install time; the installer prints a hint to run autovault setup from a terminal afterward.
AUTOVAULT_YES opt1Accept default answers in the installer's non-prompt branches. Referenced in the NoTtyError message setup prints when invoked without a TTY.
AUTOVAULT_NO_BOOTSTRAP opt1Skip bootstrap-skills.mjs. No bundled skills are installed. Primarily for development.

Library exports

source package · TypeScript-first

The source package exports the same storage, validation, profile-sync, and capability-resolution helpers used by the CLI and MCP server. This is useful for local integrations built from the repository; it is not a separately documented public SDK package.

resolveCapabilities(input)

stablesince 0.2.1

Resolve tools, skills, and MCP servers for a scoped caller request. Unknown callers fail closed unless mapped to a restricted profile.

resolveCapabilities({ caller_id, platform, query, channel })

skill lifecycle helpers

stablesince 0.2.0

Grouped source exports for installing from configured sources, validating caller-authored SKILL.md bytes, or refreshing an installed skill. MCP tools wrap these same helpers.

addSkill(input)
proposeSkill(input)
updateSkill(input)

syncProfiles(input)

stablesince 0.2.0

Regenerate per-agent and tag-filtered profile symlinks from installed skill metadata and optional profile config.

syncProfiles({ discover: true, profileRoots })

MCP tools

local stdio · remote /mcp

MCP tools are the agent-facing API. Local hosts spawn the stdio server; remote clients connect to Streamable HTTP MCP at <code>/mcp</code> with OAuth and role-aware filtering.

get_skill

stablesince 0.1.0

Search by query or fetch one installed skill by name. Pass include_resources when packaged resource files are needed.

{ query?: string, name?: string, agent?: string, include_resources?: boolean }

add_skill

stablesince 0.1.0

Install a known skill from GitHub, agentskills, HTTPS URL, or local bundle source. Caller-authored bytes should use propose_skill instead. For local bundles, pass skill_dir and an explicit identifier matching the CLI provenance value.

{ source: "github" | "agentskills" | "url" | "local", identifier: string, ... }

propose_skill

stablesince 0.1.0

Submit newly authored SKILL.md content for validation, security scan, capability cross-check, deduplication, signing, and storage.

{ skill_md: string, resources?: Array<{ path: string, content: string }> }

check_updates

stablesince 0.1.0

Compare installed skills against recorded upstream source state and report drift, unchecked inline skills, warnings, and errors.

{ skill?: string }

Hosted sync

AutoVault Cloud · device-signed HTTPS

Four routes under /v/<slug>/, served by AutoVault Cloud. Every one of them is signed: there are no anonymous reads and no API keys. A device holds an Ed25519 keypair, signs the string METHOD, newline, pathname, newline, unix seconds, and Cloud verifies the detached signature against the public key it enrolled. Timestamps more than 300 seconds off are rejected. There is no route here that writes a catalog. Publishing is owner-side and out of band, so nothing here writes a catalog, and the CLI that uses these routes is purely a consumer of one. The surface itself is one write and three reads: POST devices enrols a key as pending, and everything else only reads. Only the enrollment route has a command to copy. The three read routes have no one-line invocation at all, because every request needs a fresh Ed25519 signature over its own path and timestamp, and a curl that omits those headers is answered with 401 rather than data.

POST /v/<slug>/devices

betasince 0.5.0

First contact. Any keypair may call this, signed by itself, which is what makes autovault link work on a machine the owner has never seen: the request enrols the key as pending and returns its device_id. The owner admits it from the Machines card on Cloud. Enrolling the same key twice returns the existing device rather than a second row, so a repeated link is safe. A vault holds at most 20 pending devices at once; admitting or denying any of them frees a slot, and a machine that is already enrolled is never locked out by a full queue.

POST /v/<slug>/devices
X-AutoVault-Device: <base64url public key>
X-AutoVault-Timestamp: <unix seconds>
X-AutoVault-Signature: <base64url detached signature>
{ "public_key": "<base64url public key>", "hostname": "<machine name>" }
Header or bodyTypeDescription
X-AutoVault-Device *base64urlThe device’s Ed25519 public key. Also the identity: there is no separate account credential on this surface.
public_key (body) *base64urlThe same key again, in the JSON body, and it must match the header byte for byte or the request is refused with 400. Enrollment is self-attested, so this is the request stating which key it is asking to enrol rather than leaving that to a header a proxy might rewrite.
X-AutoVault-Timestamp *integerWhole seconds since the epoch. Rejected beyond a 300 second skew in either direction.
X-AutoVault-Signature *base64urlDetached Ed25519 signature over <METHOD>\n<pathname>\n<unix-seconds>, where pathname is the full request path.

GET /v/<slug>/devices/current

betasince 0.5.0

What the CLI polls while it waits for an owner to click Admit. Readable by any enrolled device, including a revoked one, which is deliberate: a machine that has lost access should be able to find that out rather than retry into a wall. Returns device_id and status, one of pending, active, or revoked. Responses are no-store, private because they are authorized per device.

GET /v/<slug>/devices/current
X-AutoVault-Device / -Timestamp / -Signature

GET /v/<slug>/catalog.json

betasince 0.5.0

The signed index of what the vault serves. Readable while a device is still pending, on purpose: autovault link enrols and then immediately reads the catalog to pin public_key, before the owner has admitted anything. Served byte-for-byte from KV, because re-serialising the JSON changes the bytes and every release signature stops verifying. A vault with nothing published yet answers 404 This vault has no published catalog yet, which is the normal state of a new vault rather than an error.

GET /v/<slug>/catalog.json
X-AutoVault-Device / -Timestamp / -Signature

GET /v/<slug>/bundles/<bundle_hash>.json

betasince 0.5.0

The skill content itself, addressed by the hash the catalog names. Active devices only, and unlike the catalog it also checks the hosted subscription: a lapsed subscriber gets 402 here while the catalog keeps answering, so billing failure reads as billing rather than as a broken vault. The client re-derives this path as bundles/<bundle_hash>.json relative to catalog.json and the path is covered by the release signature, so bundles cannot be renamed, moved, or redirected. Nothing under /v/ may return a 3xx at all: the CLI fetches with redirect: "manual" and throws on any redirect it sees.

GET /v/<slug>/bundles/<bundle_hash>.json
X-AutoVault-Device / -Timestamp / -Signature