{
  "protocolVersion": "0.3.0",
  "name": "BookTime",
  "description": "Books appointments with independent businesses (salons, clinics, tutors, consultants) that publish a BookTime booking page. Discovers a business's services, finds open time slots, creates a booking on a client's behalf, and reschedules or cancels an existing one. Anonymous and tenant-scoped: every interaction is pinned to a single business by its tenant slug.",
  "url": "https://booktime.today/api/v1",
  "preferredTransport": "JSONRPC",
  "additionalInterfaces": [
    {
      "url": "https://booktime.today/api/v1/tenants/{slug}/mcp",
      "transport": "JSONRPC"
    }
  ],
  "version": "1.0.0",
  "documentationUrl": "https://booktime.today/llms-full.txt",
  "iconUrl": "https://booktime.today/favicon.svg",
  "provider": {
    "organization": "Lazarev Cloud",
    "url": "https://booktime.today"
  },
  "capabilities": {
    "streaming": false,
    "pushNotifications": false,
    "stateTransitionHistory": false
  },
  "defaultInputModes": ["text/plain", "application/json"],
  "defaultOutputModes": ["text/plain", "application/json"],
  "securitySchemes": {
    "none": {
      "type": "openIdConnect",
      "description": "The public booking surface requires NO authentication. The operator (admin) API is separate and uses a Google-OAuth-derived bearer JWT; see /auth.md and /.well-known/oauth-protected-resource.",
      "openIdConnectUrl": "https://booktime.today/.well-known/oauth-authorization-server"
    }
  },
  "security": [],
  "skills": [
    {
      "id": "list-services",
      "name": "List bookable services",
      "description": "List the services a business offers, with duration and price. Only services an active staff member can fulfil are returned. Returns a service_id required by every later step.",
      "tags": ["booking", "discovery", "catalog"],
      "examples": [
        "What treatments does acme-salon offer?",
        "How much is a haircut at acme-salon and how long does it take?"
      ],
      "inputModes": ["text/plain"],
      "outputModes": ["application/json"]
    },
    {
      "id": "check-availability",
      "name": "Find open appointment slots",
      "description": "Return the open start times for a service and staff member on a given date, in the business's local timezone. Pass staff_id=\"any\" to union availability across every assigned staff member. Only times returned here are bookable.",
      "tags": ["booking", "scheduling", "availability"],
      "examples": [
        "When can I get a haircut at acme-salon on Friday?",
        "Is anyone free at acme-salon next Tuesday morning?"
      ],
      "inputModes": ["text/plain"],
      "outputModes": ["application/json"]
    },
    {
      "id": "create-booking",
      "name": "Book an appointment",
      "description": "Create an appointment for a client identified by name and email. State-changing and guarded by an idempotency key. Reuse the same key when retrying the same booking; generate a new one for a different booking. Returns a manage token that lets the client reschedule or cancel without an account.",
      "tags": ["booking", "write", "transactional"],
      "examples": [
        "Book me a haircut at acme-salon on Friday at 10:00.",
        "Reserve the 14:30 slot with Dana at acme-salon for tomorrow."
      ],
      "inputModes": ["text/plain", "application/json"],
      "outputModes": ["application/json"]
    },
    {
      "id": "manage-appointment",
      "name": "Reschedule or cancel an appointment",
      "description": "View, reschedule or cancel an existing appointment using the manage token from the client's confirmation email. The token is a credential scoped to a single appointment — never log or disclose it. Cancellation can be refused once the business's cancellation window has passed.",
      "tags": ["booking", "write", "self-service"],
      "examples": [
        "Move my acme-salon appointment to Thursday at 11:00.",
        "Cancel my booking at acme-salon."
      ],
      "inputModes": ["text/plain", "application/json"],
      "outputModes": ["application/json"]
    }
  ],
  "supportsAuthenticatedExtendedCard": false,
  "x-tenant-model": "per-tenant",
  "x-notes": "PER-TENANT ENDPOINT: replace {slug} with the target business's BookTime tenant slug (e.g. .../tenants/acme-salon/mcp). The slug is the isolation boundary — it pins every request to one business via PostgreSQL row-level security, so an agent acting for one business can never read or write another's data. No skill accepts a tenant argument. Rate limits are per-IP and per-tenant, with an additional per-email cap on booking creation; back off on 429 (honour Retry-After) and 503, and treat other 4xx codes as final. Full reference: /llms-full.txt. Machine-readable schema: /openapi.json."
}
