Calendars for AI agents: free/busy, next free slot, and bookings PostgreSQL never double-books.
Connect Runs on your machine
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
{
"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>"
}
}
}
}
{
"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>"
}
}
}
}
{
"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
| Name | Description |
|---|---|
DATABASE_URLRequired, 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_TOKENOptional, 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_SECRETOptional, secret | Signs pending write confirmations: at least 32 random characters, different from the token. Required unless SLOTLOCK_CONFIRM_WRITES is none. |
SLOTLOCK_METRICS_TOKENOptional, secret | Serves Prometheus metrics at /metrics to this bearer token: at least 32 random characters, different from every other secret. Off without it. |
PORTOptional | Port the server listens on inside the container. |
SLOTLOCK_MIGRATE_DATABASE_URLOptional, 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_WRITESOptional | 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_AVAILABILITYOptional | 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_APIOptional | 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_DAYSOptional | 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_LIMITSOptional | 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_WEBHOOKSOptional | 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_TENANTOptional | The tenant SLOTLOCK_AUTH_TOKEN acts in; API keys act in their own tenant. |
Details
| Package | ghcr.io/pilotaai/slotlock:0.10.2 (OCI, streamable-http) |
| First published | 12 Nov 2026 |
| Last updated | 12 Nov 2026 |
| Registry name | io.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.
