Any AI agent -- ChatGPT, Claude, Gemini, Copilot -- can check your availability, read your profile, and book a meeting through a single MCP endpoint. The same scheduling kernel humans see. No invented slots.
Switch between the tools list, a live booking call, and the raw curl. Every response comes from the same scheduling engine your public page uses.
{ "jsonrpc": "2.0", "id": 1, "result": { "tools": [ { "name": "check_availability", "description": "Check available time slots for a specific user on a given date", "inputSchema": { "type": "object", "properties": { "username": { "type": "string" }, "date": { "type": "string", "description": "ISO 8601 date (YYYY-MM-DD)" } }, "required": ["username", "date"] } }, { "name": "book_meeting", "description": "Create a booking with a Dayla user", "inputSchema": { "type": "object", "properties": { "username": { "type": "string" }, "eventTypeId": { "type": "string", "description": "Event type id from get_profile" }, "slot": { "type": "string", "description": "ISO datetime from check_availability" }, "name": { "type": "string" }, "email": { "type": "string", "format": "email" } }, "required": ["username", "eventTypeId", "slot", "name", "email"] } }, { "name": "get_profile", "description": "Read public profile, bio, and event types", "inputSchema": { "type": "object", "properties": { "username": { "type": "string" } }, "required": ["username"] } } ] }}There is one scheduling engine. The public page and the MCP endpoint hit the same rules, the same buffers, the same holds. An agent cannot book a slot that a human could not book.
One code path. No separate "API availability" that drifts from the page. If a buffer rule changes, both surfaces update instantly.
Every agent gets a scoped page token. Create, limit, and revoke -- all from Dashboard -> Developers. No OAuth dance, no shared secrets.
Generate a scoped developer/API key from Dashboard -> Developers. Choose read-only (availability + profile) or read-write (book meetings) scopes where supported.
Each key carries explicit permissions. An agent that only checks free time should use read-only scopes and cannot create bookings without write:booking.
Revoke a key from the dashboard/API. Requests with that key are rejected after revocation; rotate any copied credentials in downstream agent tools.
Agents need predictable errors, not vague 500s. Every failure mode has a code, a reason string, and a documented recovery path.
| ERROR | WHEN | RESPONSE | RECOVERY |
|---|---|---|---|
| busy | Requested slot was taken between availability check and booking call | 409 Conflict -- booking_id null, status "failed", reason "slot_unavailable" | Agent should retry with next available slot from the original check_availability response. |
| min_notice | Requested start time is inside the minimum-notice window (default 2h) | 400 Bad Request -- reason "min_notice_violation", earliest_accepted timestamp | Agent should pick a slot at or after earliest_accepted. |
| hold_expired | A temporary hold on a slot expired before the booking call completed | 410 Gone -- reason "hold_expired", slot may still be available | Agent can re-check availability and retry. Holds last 60 seconds. |
| invalid_token | Token was revoked or never existed | 401 Unauthorized -- reason "invalid_token" | Generate a new key in Dashboard -> Developers. Old keys are rejected after revocation. |
| scope_violation | A read-only token attempted book_meeting | 403 Forbidden -- reason "insufficient_scope", required "write:booking" | Create a write:booking key or use the existing key only for availability checks. |
Every error includes a reason field the agent can branch on programmatically. No guesswork, no parsing error strings.
Claim your handle and set your availability rules.
curl -X POST https://dayla.apps.softblaze.net/api/v1/pages -d '{"handle":"alex"}'Dashboard -> Developers. Pick read-only or write:booking scope.
curl -X POST https://dayla.apps.softblaze.net/api/v1/api-keys -H 'Authorization: Bearer $DAYLA_SESSION_JWT' -d '{"name":"Agent key","scopes":["write:booking"]}'Register with any agent. One endpoint, three tools.
curl -X POST https://dayla.apps.softblaze.net/api/v1/mcp -d '{"method":"tools/list"}'Connect Dayla as a custom tool -- ChatGPT checks availability and books on your behalf.
Register the Dayla MCP server and Claude reads profiles, finds slots, schedules meetings.
Add Dayla as a tool -- Gemini queries real-time availability and creates bookings.
Extend your coding assistant with scheduling -- review sessions, pair programming slots.
Agent can check free time and read public profile. Cannot book, cancel, or modify anything. Give this to agents you do not fully trust.
Agent can create bookings. Cannot cancel or delete. Cancellation requires a separate token scope or the booking cancel URL sent to the invitee.
Tokens are SHA-256 hashed in the database. The full token is shown once at creation. API logs redact the Authorization header entirely.
Each token is scoped to a single page. An agent booking on /alex cannot see or touch /sam. Compromise is bounded to one page.
Per-page API tokens use a 100 requests/minute token bucket. Webhook signatures use HMAC-SHA256. No plaintext credentials anywhere in the pipeline.
Create a page, generate a token, register the MCP server. Your agents will book real meetings against real availability -- in production, today.