# Tempi > Scheduling links for people and teams, like Calendly. A booking link looks like https://meettempi.com//, where the handle is a person or a team. Anyone, human or AI assistant (Claude, Codex…), can find a free time and book it. Hosts connect Google Calendar, Outlook or iCloud. Tempi offers only times when they're free, and adds each booking to their calendar, which sends the invitee an invitation. ## Connect - Book with anyone, no account: MCP server https://meettempi.com/mcp (Streamable HTTP) - Claude Code: `claude mcp add --transport http tempi https://meettempi.com/mcp` - Codex: add to ~/.codex/config.toml → `[mcp_servers.tempi]` with `url = "https://meettempi.com/mcp"` - Set up and run the user's own Tempi account: MCP server https://meettempi.com/mcp/account (OAuth 2.1). The user signs in and allows "Manage my account" or "Read only". Discovery: https://meettempi.com/.well-known/oauth-protected-resource/mcp/account - Claude: Tempi is in Claude's connector directory (search for "Tempi"), or add a custom connector with that URL - ChatGPT: add a custom connector with that URL - Claude Code: `claude mcp add --transport http tempi-account https://meettempi.com/mcp/account`, then `/mcp` to sign in - OpenAPI 3.1: https://meettempi.com/api/openapi.json. Plain REST works too. Scripts use an API key: `Authorization: Bearer bk_...` ## Book a meeting for someone (no auth) Every booking page can be read as Markdown: append `.md` (e.g. https://meettempi.com//.md) or send `Accept: text/markdown`. 1. `get_public_profile { handle }`: the person or team and their event types (duration, price, hosts). A booking link works wherever a handle or slug is asked for. 2. `get_available_slots { handle, slug, timezone, date | from/to }`: open start times, grouped by the invitee's local day with local `times` to show. `next` is the next open time when the range has none, and `bookableUntil` how far ahead people can book. 3. `create_booking { handle, slug, start, name, email, timezone, notes }`. - Free events: confirmed immediately. Tempi emails the invitee a confirmation with the manage link and a calendar file (.ics), so the meeting lands in their calendar. - Event types with `requiresApproval`: status is `pending_approval`. It's a request, not a booking yet. It holds the time until a host approves or declines it (`approve_booking`, `decline_booking`), and lapses if nobody does before it starts. Tell the human it isn't confirmed yet. - Always keep `manageUrl` (contains `token`). It is the only way to view, reschedule or cancel. 4. Reschedule: `get_available_slots` with `bookingId` + `token`, then `reschedule_booking_as_invitee { id, token, start }`. The manageUrl works as both `id` and `token`. 5. Cancel: `cancel_booking_as_invitee { id, token, reason }`. 6. Series: when an event type has `repeatMax`, the invitee can book up to that many meetings every 1, 2 or 4 weeks at the same time. `check_series { handle, slug, start, every, count }`, then `create_booking` with `repeat: { every, count }`. Each meeting has its own manageUrl. `following: true` on cancel also cancels the later ones. Times are ISO-8601 in UTC. Always pass the invitee's time zone (an IANA id, or an abbreviation like EST) and show the human the local `times` and `when` the results give. Errors are JSON `{ "error": { "code", "message", "details"? } }`. `slot_unavailable` (409) says why the time can't be booked, with the `nearest` open times in `details`. - `get_public_profile` — GET /api/v1/public/{handle}: List a person's or team's event types - `get_available_slots` — GET /api/v1/public/{handle}/{slug}/slots: Find open times - `check_series` — GET /api/v1/public/{handle}/{slug}/series: Check a repeating series before booking it - `check_time` — GET /api/v1/public/{handle}/{slug}/check: Check a time is still open before booking it - `create_booking` — POST /api/v1/public/{handle}/{slug}/bookings: Book a meeting - `get_booking` — GET /api/v1/public/bookings/{id}: View a booking (invitee) - `reschedule_booking_as_invitee` — POST /api/v1/public/bookings/{id}/reschedule: Reschedule a booking (invitee) - `cancel_booking_as_invitee` — POST /api/v1/public/bookings/{id}/cancel: Cancel a booking (invitee) - `get_review` — GET /api/v1/public/review/{id}: View a request from its email link (host) - `answer_review` — POST /api/v1/public/review/{id}: Approve or decline a request from its email link (host) - `join_waitlist` — POST /api/v1/waitlist: Join the private beta waitlist ## Set up and manage the user's account Connect to https://meettempi.com/mcp/account (OAuth: the user approves in their browser). Scripts can instead send an API key (Settings → API keys) as `Authorization: Bearer bk_...` to https://meettempi.com/mcp or the REST API. Event types belong to teams. Every user has a personal team whose slug is their username. Team events are `round_robin` (one free host, load-balanced) or `collective` (all hosts attend). An event type uses its hosts' working hours unless it has its own `schedule` (for example, Fridays 14:00-17:00 only). Hosts' days off, calendars and bookings count either way. A typical setup: `get_me` → `set_availability` (working hours) → `create_team` + `add_team_member` (for a team) → `create_event_type` → share the returned `url`. `preview_availability` shows the next days as people booking see them: each day's status and summary, the open time, and what takes the rest (a booking, or busy time in a calendar), plus which event types use these hours. Start there for "when am I free?" or "why can't people book me?". Take a day off with `set_date_override` (windows []). Connecting Google Calendar or Outlook needs the user in a browser: send them to https://meettempi.com/dashboard/calendars. A read-only connection gets `insufficient_scope` on changes. Ask the user to reconnect and allow "Manage my account". - `get_me` — GET /api/v1/me: Get the current account - `update_me` — PATCH /api/v1/me: Update your profile - `set_my_video_call` — POST /api/v1/me/video: Set your video call - `get_availability` — GET /api/v1/availability: Get working hours - `preview_availability` — GET /api/v1/availability/preview: See your next days as people booking you see them - `get_open_times` — GET /api/v1/me/open-times: Check that your booking pages have open times - `set_availability` — POST /api/v1/availability: Replace weekly hours - `set_meeting_limits` — PATCH /api/v1/availability/limits: Cap meetings per day or week - `set_date_override` — POST /api/v1/availability/overrides: Set hours for a specific date - `delete_date_override` — DELETE /api/v1/availability/overrides/{date}: Remove a date override - `list_teams` — GET /api/v1/teams: List your teams - `get_team` — GET /api/v1/teams/{team}: Get a team - `create_team` — POST /api/v1/teams: Create a team - `update_team` — PATCH /api/v1/teams/{team}: Update a team - `delete_team` — DELETE /api/v1/teams/{team}: Delete a team - `add_team_member` — POST /api/v1/teams/{team}/members: Add a team member - `resend_team_invite` — POST /api/v1/teams/{team}/invites/resend: Email an invite again - `update_team_member` — PATCH /api/v1/teams/{team}/members/{userId}: Change a member's role - `remove_team_member` — DELETE /api/v1/teams/{team}/members/{member}: Remove a member or invite - `get_shared_hours` — GET /api/v1/teams/{team}/shared-hours: Check when hosts all work - `list_event_types` — GET /api/v1/event-types: List event types - `create_event_type` — POST /api/v1/event-types: Create an event type - `update_event_type` — PATCH /api/v1/event-types/{id}: Update an event type - `archive_event_type` — POST /api/v1/event-types/{id}/archive: Archive an event type - `restore_event_type` — POST /api/v1/event-types/{id}/restore: Restore an archived event type - `explain_availability` — GET /api/v1/event-types/{id}/availability: Explain why times can or can't be booked - `preview_event_type_times` — POST /api/v1/event-types/preview-times: Try event type settings before saving - `list_bookings` — GET /api/v1/bookings: List bookings - `get_host_booking` — GET /api/v1/bookings/{id}: View a booking (host) - `reschedule_booking` — POST /api/v1/bookings/{id}/reschedule: Reschedule a booking (host) - `cancel_booking` — POST /api/v1/bookings/{id}/cancel: Cancel a booking (host) - `approve_booking` — POST /api/v1/bookings/{id}/approve: Approve a booking request - `decline_booking` — POST /api/v1/bookings/{id}/decline: Decline a booking request - `retry_booking_calendar` — POST /api/v1/bookings/{id}/calendar: Retry a booking’s calendar event - `set_booking_link` — POST /api/v1/bookings/{id}/link: Give a booking its meeting link - `list_calendar_connections` — GET /api/v1/calendars: List connected calendars - `connect_apple_calendar` — POST /api/v1/calendars/apple: Connect iCloud Calendar - `set_booking_calendar` — POST /api/v1/calendars/{id}/booking: Choose the booking calendar - `delete_calendar_connection` — DELETE /api/v1/calendars/{id}: Disconnect a calendar - `list_webhooks` — GET /api/v1/teams/{team}/webhooks: List webhooks - `create_webhook` — POST /api/v1/teams/{team}/webhooks: Add a webhook - `test_webhook` — POST /api/v1/webhooks/{id}/test: Test a webhook - `delete_webhook` — DELETE /api/v1/webhooks/{id}: Remove a webhook - `sample_webhook_events` — GET /api/v1/teams/{team}/webhooks/sample: Sample webhook events - `get_billing` — GET /api/v1/teams/{team}/billing: Get a team's plan - `note_plan_card` — POST /api/v1/teams/{team}/billing/seen: Count a look at the Team plan card - `want_team_plan` — POST /api/v1/teams/{team}/billing/interest: Say whether you'd pay for the Team plan - `list_waitlist` — GET /api/v1/admin/waitlist: List the waitlist (admin) - `decide_waitlist` — POST /api/v1/admin/waitlist/decide: Approve or reject waitlist requests (admin) - `get_insights` — GET /api/v1/insights: Get product analytics (admin) - `get_feature_use` — GET /api/v1/insights/features: Get who uses which feature (admin) - `list_covers` — GET /api/v1/covers: List painted covers - `list_made_covers` — GET /api/v1/admin/covers: List every cover, for the cover maker (admin) - `search_cover_sources` — GET /api/v1/admin/covers/sources: Search the museums for paintings to make a cover from (admin) - `list_cover_gaps` — GET /api/v1/admin/covers/gaps: What hosts need covers for (admin) - `set_cover_hidden` — POST /api/v1/admin/covers/{id}/hidden: Hide or show a cover (admin) - `search_addresses` — GET /api/v1/addresses: Suggest addresses for an in-person event type