NestDaddy

Slotlock

io.github.PILOTAAI/slotlock · v0.10.2

Calendars for AI agents: free/busy, next free slot, and bookings PostgreSQL never double-books.

Connect Runs on your machine

Terminal
claude mcp add slotlock -e DATABASE_URL=<DATABASE_URL> -e SLOTLOCK_AUTH_TOKEN=<SLOTLOCK_AUTH_TOKEN> -e SLOTLOCK_CONFIRMATION_SECRET=<SLOTLOCK_CONFIRMATION_SECRET> -e SLOTLOCK_METRICS_TOKEN=<SLOTLOCK_METRICS_TOKEN> -e PORT=<PORT> -e SLOTLOCK_MIGRATE_DATABASE_URL=<SLOTLOCK_MIGRATE_DATABASE_URL> -e SLOTLOCK_CONFIRM_WRITES=<SLOTLOCK_CONFIRM_WRITES> -e SLOTLOCK_AVAILABILITY=<SLOTLOCK_AVAILABILITY> -e SLOTLOCK_REST_API=<SLOTLOCK_REST_API> -e SLOTLOCK_RETENTION_DAYS=<SLOTLOCK_RETENTION_DAYS> -e SLOTLOCK_SHARED_LIMITS=<SLOTLOCK_SHARED_LIMITS> -e SLOTLOCK_WEBHOOKS=<SLOTLOCK_WEBHOOKS> -e SLOTLOCK_TENANT=<SLOTLOCK_TENANT> -- docker run -i --rm ghcr.io/pilotaai/slotlock:0.10.2
claude_desktop_config.json
{
  "mcpServers": {
    "slotlock": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "ghcr.io/pilotaai/slotlock:0.10.2"
      ],
      "env": {
        "DATABASE_URL": "<DATABASE_URL>",
        "SLOTLOCK_AUTH_TOKEN": "<SLOTLOCK_AUTH_TOKEN>",
        "SLOTLOCK_CONFIRMATION_SECRET": "<SLOTLOCK_CONFIRMATION_SECRET>",
        "SLOTLOCK_METRICS_TOKEN": "<SLOTLOCK_METRICS_TOKEN>",
        "PORT": "<PORT>",
        "SLOTLOCK_MIGRATE_DATABASE_URL": "<SLOTLOCK_MIGRATE_DATABASE_URL>",
        "SLOTLOCK_CONFIRM_WRITES": "<SLOTLOCK_CONFIRM_WRITES>",
        "SLOTLOCK_AVAILABILITY": "<SLOTLOCK_AVAILABILITY>",
        "SLOTLOCK_REST_API": "<SLOTLOCK_REST_API>",
        "SLOTLOCK_RETENTION_DAYS": "<SLOTLOCK_RETENTION_DAYS>",
        "SLOTLOCK_SHARED_LIMITS": "<SLOTLOCK_SHARED_LIMITS>",
        "SLOTLOCK_WEBHOOKS": "<SLOTLOCK_WEBHOOKS>",
        "SLOTLOCK_TENANT": "<SLOTLOCK_TENANT>"
      }
    }
  }
}
~/.cursor/mcp.json
{
  "mcpServers": {
    "slotlock": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "ghcr.io/pilotaai/slotlock:0.10.2"
      ],
      "env": {
        "DATABASE_URL": "<DATABASE_URL>",
        "SLOTLOCK_AUTH_TOKEN": "<SLOTLOCK_AUTH_TOKEN>",
        "SLOTLOCK_CONFIRMATION_SECRET": "<SLOTLOCK_CONFIRMATION_SECRET>",
        "SLOTLOCK_METRICS_TOKEN": "<SLOTLOCK_METRICS_TOKEN>",
        "PORT": "<PORT>",
        "SLOTLOCK_MIGRATE_DATABASE_URL": "<SLOTLOCK_MIGRATE_DATABASE_URL>",
        "SLOTLOCK_CONFIRM_WRITES": "<SLOTLOCK_CONFIRM_WRITES>",
        "SLOTLOCK_AVAILABILITY": "<SLOTLOCK_AVAILABILITY>",
        "SLOTLOCK_REST_API": "<SLOTLOCK_REST_API>",
        "SLOTLOCK_RETENTION_DAYS": "<SLOTLOCK_RETENTION_DAYS>",
        "SLOTLOCK_SHARED_LIMITS": "<SLOTLOCK_SHARED_LIMITS>",
        "SLOTLOCK_WEBHOOKS": "<SLOTLOCK_WEBHOOKS>",
        "SLOTLOCK_TENANT": "<SLOTLOCK_TENANT>"
      }
    }
  }
}
.vscode/mcp.json
{
  "servers": {
    "slotlock": {
      "type": "stdio",
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "ghcr.io/pilotaai/slotlock:0.10.2"
      ],
      "env": {
        "DATABASE_URL": "<DATABASE_URL>",
        "SLOTLOCK_AUTH_TOKEN": "<SLOTLOCK_AUTH_TOKEN>",
        "SLOTLOCK_CONFIRMATION_SECRET": "<SLOTLOCK_CONFIRMATION_SECRET>",
        "SLOTLOCK_METRICS_TOKEN": "<SLOTLOCK_METRICS_TOKEN>",
        "PORT": "<PORT>",
        "SLOTLOCK_MIGRATE_DATABASE_URL": "<SLOTLOCK_MIGRATE_DATABASE_URL>",
        "SLOTLOCK_CONFIRM_WRITES": "<SLOTLOCK_CONFIRM_WRITES>",
        "SLOTLOCK_AVAILABILITY": "<SLOTLOCK_AVAILABILITY>",
        "SLOTLOCK_REST_API": "<SLOTLOCK_REST_API>",
        "SLOTLOCK_RETENTION_DAYS": "<SLOTLOCK_RETENTION_DAYS>",
        "SLOTLOCK_SHARED_LIMITS": "<SLOTLOCK_SHARED_LIMITS>",
        "SLOTLOCK_WEBHOOKS": "<SLOTLOCK_WEBHOOKS>",
        "SLOTLOCK_TENANT": "<SLOTLOCK_TENANT>"
      }
    }
  }
}

Replace the values in angle brackets with your own. Keys stay on your machine; we never see them.

Tools

This server runs locally, so its tools are listed by your MCP client once it starts.

Environment variables

NameDescription
DATABASE_URL
Required, secret
postgres:// URL of a PostgreSQL 16 or newer database the container can reach, as a role that is not a superuser and has no BYPASSRLS: serve refuses one, since row-level security would not confine it. Without SLOTLOCK_MIGRATE_DATABASE_URL this role also applies the schema, so it must be able to crea…
SLOTLOCK_AUTH_TOKEN
Optional, secret
Optional bearer token for SLOTLOCK_TENANT, with read and write (never admin): at least 32 random characters (openssl rand -hex 32). Leave it unset to accept only API keys (slotlock key create).
SLOTLOCK_CONFIRMATION_SECRET
Optional, secret
Signs pending write confirmations: at least 32 random characters, different from the token. Required unless SLOTLOCK_CONFIRM_WRITES is none.
SLOTLOCK_METRICS_TOKEN
Optional, secret
Serves Prometheus metrics at /metrics to this bearer token: at least 32 random characters, different from every other secret. Off without it.
PORT
Optional
Port the server listens on inside the container.
SLOTLOCK_MIGRATE_DATABASE_URL
Optional, secret
postgres:// URL of the schema owner. When set, migration runs as this role and grants the DATABASE_URL role only what it needs at runtime.
SLOTLOCK_CONFIRM_WRITES
Optional
Writes that wait for a person to confirm them: none, all, or a comma-separated list of slotlock_create_event, slotlock_book_together, slotlock_book_pool, slotlock_update_event, slotlock_delete_event. Clients without MCP 2026-07-28 form elicitation have guarded writes refused.
SLOTLOCK_AVAILABILITY
Optional
JSON array of weekly bookable-hours rules, e.g. [{"rrule":"FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR","startMinutes":540,"durationMinutes":480}]. Without rules no slot is ever offered.
SLOTLOCK_REST_API
Optional
on: also serve the tools as a REST API under /v1, and the application API (resources, bookable hours, holds, reservations, coverage, maintenance) for admin keys, described by an OpenAPI 3.1 document at /openapi.json. Writes that wait for confirmation answer 428 there. off: MCP and A2A only.
SLOTLOCK_RETENTION_DAYS
Optional
Days of history kept: the change feed (who made each change included) and how far back a cursor reaches, and ended waitlist entries; retried writes are answered for at least 30 days whatever it is. 1-3650; default 30.
SLOTLOCK_SHARED_LIMITS
Optional
on: tenant request budgets (SLOTLOCK_LIMITS' tenant_* and app_*) are shared by every server of a deployment through PostgreSQL, so N servers allow a tenant its rate once, not N times. off: each server keeps its own.
SLOTLOCK_WEBHOOKS
Optional
on: deliver each tenant's changes to its webhooks (POST /v1/webhooks), signed as Standard Webhooks; never to a private network address. private: those too, for testing. off: keep the change feed (GET /v1/changes), send nothing.
SLOTLOCK_TENANT
Optional
The tenant SLOTLOCK_AUTH_TOKEN acts in; API keys act in their own tenant.

Details

Packageghcr.io/pilotaai/slotlock:0.10.2 (OCI, streamable-http)
First published12 Nov 2026
Last updated12 Nov 2026
Registry nameio.github.PILOTAAI/slotlock

More databases servers See all

Listing data from the official MCP registry. Status and tools from NestDaddy's daily check. Browse all MCP servers.