Documentation

Last updated: 2026-09-20

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:

{
  "mcpServers": {
    "everlock": {
      "type": "http",
      "url": "http://localhost:8080/mcp",
      "headers": {
        "Authorization": "Bearer <api key from /users apikey create <login>>"
      }
    }
  }
}

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:

ClientTop-level keyTransport field
Claude Code, Claude DesktopmcpServers"type": "http"
VS Code (.vscode/mcp.json)servers"type": "http"
CursormcpServersnone — url alone
oMLXmcpServers"transport": "streamable-http"

Tool names derive from command paths: /users apikey create becomes users_apikey_create.

admin mcp api