{"name":"io.github.PILOTAAI/slotlock","slug":"pilotaai-slotlock","title":"Slotlock","description":"Calendars for AI agents: free/busy, next free slot, and bookings PostgreSQL never double-books.","url":"https://mcp.market/server/pilotaai-slotlock","rating":null,"grade":"B","score":70,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":18,"stars":0,"forks":0,"downloads_week":null,"last_push_at":"2026-10-23T23:24:17.000Z","license":"Apache-2.0"},"uptime":null,"claimed":false,"transport":"oci","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/PILOTAAI/slotlock","website":"https://slotlock.pylota.io","version":"0.6.0","remotes":[],"packages":[{"registryType":"oci","identifier":"ghcr.io/pilotaai/slotlock:0.6.0","runtimeHint":"docker","transport":{"type":"streamable-http","url":"http://localhost:{PORT}/mcp","headers":[{"description":"A bearer the server accepts: SLOTLOCK_AUTH_TOKEN, or an API key from `slotlock key create` (slk_...).","isRequired":true,"value":"Bearer {token}","isSecret":true,"variables":{"token":{"description":"SLOTLOCK_AUTH_TOKEN, or an API key (slk_...), which acts in the tenant it was created in.","isRequired":true,"isSecret":true}},"name":"Authorization"}]},"runtimeArguments":[{"description":"Publish the server on this machine's loopback interface only.","variables":{"PORT":{"description":"The same value as the PORT environment variable.","isRequired":true,"format":"number","default":"8080"}},"type":"named","name":"-p","value":"127.0.0.1:{PORT}:{PORT}"}],"packageArguments":[{"description":"Serve MCP and A2A over HTTP.","type":"positional","value":"serve"},{"description":"Apply the schema first (idempotent).","type":"positional","value":"--migrate"}],"environmentVariables":[{"description":"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 create it.","isRequired":true,"isSecret":true,"name":"DATABASE_URL"},{"description":"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).","isSecret":true,"name":"SLOTLOCK_AUTH_TOKEN"},{"description":"Signs pending write confirmations: at least 32 random characters, different from the token. Required unless SLOTLOCK_CONFIRM_WRITES is none.","isSecret":true,"name":"SLOTLOCK_CONFIRMATION_SECRET"},{"description":"Serves Prometheus metrics at /metrics to this bearer token: at least 32 random characters, different from every other secret. Off without it.","isSecret":true,"name":"SLOTLOCK_METRICS_TOKEN"},{"description":"Port the server listens on inside the container.","format":"number","default":"8080","name":"PORT"},{"description":"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.","isSecret":true,"name":"SLOTLOCK_MIGRATE_DATABASE_URL"},{"description":"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.","default":"none","name":"SLOTLOCK_CONFIRM_WRITES"},{"description":"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.","name":"SLOTLOCK_AVAILABILITY"},{"description":"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.","default":"on","name":"SLOTLOCK_REST_API"},{"description":"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.","format":"number","name":"SLOTLOCK_RETENTION_DAYS"},{"description":"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.","default":"off","name":"SLOTLOCK_SHARED_LIMITS"},{"description":"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.","default":"on","name":"SLOTLOCK_WEBHOOKS"},{"description":"The tenant SLOTLOCK_AUTH_TOKEN acts in; API keys act in their own tenant.","default":"default","name":"SLOTLOCK_TENANT"}]}],"tools":[],"scan":null,"grade_history":[],"reviews":[]}