Policy gate on every call
The same role + scope filter runs at the MCP boundary. Non-owner reads are filtered by capability access; writes require explicit scope:write.
In remote mode, the same vault binary speaks Streamable HTTP MCP with OAuth auth-code + PKCE. Stand it up on a real host so agents can resolve, read, propose, and update signed skills through MCP; local filesystem-native host folders still require local profile sync or a future mirror helper.
Self-host the remote MCP service with the documented Docker or Railway paths. Local installs remain the source of truth for host profile links. Remote mode cannot create symlinks on client machines. Remote clients should discover and read skills through get_skill when they cannot read your local filesystem.
Start from the AutoVault template rather than a raw repo deploy. The template is wired for the remote MCP container and keeps the public setup path reproducible.
https://railway.com/deploy/autovault?referralCode=VuFE6g&utm_medium=integration&utm_source=template&utm_campaign=genericRailway should prompt for the first owner email and a secret admin password. The password must be at least 12 characters and is hashed on first boot.
AUTOVAULT_ADMIN_EMAIL=admin@example.com
AUTOVAULT_ADMIN_PASSWORD=<long random string, min 12 chars>The remote server stores users, OAuth keys, signing keys, and skills under the vault path. Keep the Railway volume mounted at /data/autovault before the first healthy deploy.
AUTOVAULT_STORAGE_PATH=/data/autovault
volume mount: /data/autovault
recommended size: 1 GBRailway injects PORT, so leave it unset. AUTOVAULT_PUBLIC_URL must match the generated *.up.railway.app domain because OAuth metadata uses it as the issuer.
AUTOVAULT_MODE=remote
AUTOVAULT_PUBLIC_URL=https://<your-service>.up.railway.app
AUTOVAULT_SECURITY_STRICT=true
AUTOVAULT_LOG_LEVEL=infoHealthz returns 200, OAuth discovery exposes the issuer, and unauthenticated MCP returns 401 with a WWW-Authenticate hint pointing at OAuth metadata.
URL=https://<your-service>.up.railway.app
curl -fsS "$URL/healthz" | jq
curl -fsS "$URL/.well-known/oauth-authorization-server" | jq
curl -i -X POST "$URL/mcp" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize"}'For advanced operators who need to debug the service shape directly, deploy the public GHCR image yourself and keep the same volume and env contract.
ghcr.io/autoworks-ai/autovault:v0.2.1
volume: /data/autovault
leave PORT unsetAll knobs are env-var driven. The first card is the breaking change in remote mode — Compose now hard-fails if these aren't set, instead of falling back to a known-default password.
remote to enable the HTTP MCP service. local (default) is stdio-only./.well-known metadata. Required in remote mode.3000. On Railway, leave it unset because Railway injects PORT and the server reads that automatically./data/autovault.$AUTOVAULT_STORAGE_PATH/autovault.sqlite.true. When true, security-scanner flags block writes; when false, they become warnings. Leave on in production.debug · info · warn · error. JSON lines emitted to stderr.Streamable HTTP MCP layered on OAuth 2.1 — auth-code flow with mandatory PKCE, dynamic client registration, refresh rotation, and revoke. Below is the exact sequence the bundled smoke suite walks for every release.
Every route the remote service exposes. Public routes are reachable pre-auth; bearer routes need a valid access token; owner routes additionally require role:owner.
The same role + scope filter runs at the MCP boundary. Non-owner reads are filtered by capability access; writes require explicit scope:write.
The /authorize endpoint rejects requests without a code_challenge. Refresh tokens rotate on use.
Browser access is opt-in. AUTOVAULT_ALLOWED_ORIGINS is a strict allowlist; server-to-server calls bypass cleanly.
npm run smoke:remoteBundled in the repo. Walks the full OAuth flow against your live deployment, calls real MCP tools, and verifies policy enforcement end-to-end. Wire it into CI to catch drift before users do.