Documentation
Admin over MCP
The backend-admin-mcp outlet exposes every admin command as a Model
Context Protocol tool over streamable HTTP, so an AI assistant administers
the instance through the same engine as the SSH console: one tool per
command (about a hundred), input schemas derived from each command's typed
input, results as structured JSON. Authorization is identical to the other
outlets — the engine authorizes every command individually against
per-resource ACLs; privileged commands require system admin.
Enabling and pinning
/backends enable admin-mcp
/server settings set admin.mcp.vhost mcp.example.org
The vhost lives in the server settings registry and
applies at the next restart; once served it is published, the HTTPS listener
binds it, and ACME issues its certificate. --backend-admin-mcp-vhost /
EVERLOCK_BACKEND_ADMIN_MCP_VHOST provide the bootstrap value; the setting
wins. The endpoint is /mcp on that host.
Authentication
MCP shares the HTTP surfaces' authentication; the natural credential for client configuration files is a Bearer API key:
Authorization: Bearer evapi_<key_id>.<secret>
Keys are minted with /users apikey create <login> [alias] [expires_days],
shown once, stored as an Argon2id hash. First-boot bootstrap prints a key
next to the generated admin password, so a fresh instance is administrable
over MCP immediately.
Transport
Public hosts serve MCP over HTTPS exclusively. Local hosts — .local
names, localhost, private IP addresses — are also served over plain HTTP,
so a LAN instance works with an mDNS-announced mcp.local name and no
certificate setup. On that path the key crosses the local network segment
in the clear: the deliberate trade-off for trusted home networks.
Client configuration
Any MCP client that speaks streamable HTTP works. For Claude Code:
claude mcp add everlock --transport http https://mcp.example.org/mcp \
--header "Authorization: Bearer evapi_…"
The start log names the endpoint once it has a host — MCP endpoint: http://localhost:8080/mcp — and links here. For a client configured through
a settings file, the block is:
The URL carries the pinned vhost on the HTTP frontend's scheme and port,
and the endpoint answers with or without a trailing slash.
/server log grep=endpoint shows the logged URL again later.
The MCP specification fixes the transport — streamable HTTP at one endpoint
URL, a bearer token in the Authorization header — but not the settings
file, so clients name the transport differently. The URL and the header are
the same everywhere; the block above is Claude Code's shape, and the others
are one substitution away:
| Client | Top-level key | Transport field |
|---|---|---|
| Claude Code, Claude Desktop | mcpServers | "type": "http" |
VS Code (.vscode/mcp.json) | servers | "type": "http" |
| Cursor | mcpServers | none — url alone |
| oMLX | mcpServers | "transport": "streamable-http" |
Tool names derive from command paths: /users apikey create becomes
users_apikey_create.