Caly: managing bookings
Find the right booking, then read, move or cancel it without surprising anyone.
Connecting and calling the tools
Every tool in this skill comes from the caly MCP server, the Caly connector, and is written here as caly:<tool>.
- Tools listed by name: call them directly, for example
caly:list_bookings. - Only
caly:search_toolsandcaly:execute_typescriptlisted (Code Mode, the default): callcaly:search_toolsfirst, then call each tool insidecaly:execute_typescriptasexternal_<tool>(for exampleexternal_list_bookings); the program mustreturnits result. - "Tool not found": switch to the Code Mode route instead of retrying the direct call.
- No
calytools at all: Caly is not connected yet. Add the server as shown in https://github.com/DevinoSolutions/mcp-servers/tree/main/caly#install; it signs in with OAuth on first use.
A refused call throws an Error whose message starts with its code, for example CONFIRMATION_REQUIRED:.
Tools you will use
caly:whoami: the account and its time zone.caly:list_bookings: the user's bookings, filtered bystatus(upcoming, past, cancelled, unconfirmed, recurring),attendeeEmail,attendeeName,eventTypeId, or a window (afterStart,beforeEnd). Paginated withtakeandskip; checkpagination.hasNextPage.caly:get_booking: one booking bybookingUid, with attendees, hosts, location and any cancellation or rescheduling details.caly:find_available_slots: free start times; passbookingUidToReschedulewhen moving a booking so its own slot counts as free.caly:reschedule_booking: moves a booking to a newstart(UTC ISO 8601), with an optionalreschedulingReason. Caly creates a new booking with a newuidand notifies the attendees.caly:cancel_booking: cancels a booking and notifies its attendees. It cannot be undone and takes two calls (see the workflow).
Workflow
Reviewing bookings
- Call
caly:whoamifor the time zone, thencaly:list_bookingswith the filters that match the question ("tomorrow" →status: ["upcoming"]plus a window; "with Sam" →attendeeNameorattendeeEmail). - Follow
pagination.hasNextPagewithskipuntil the window is covered, or tell the user how many more there are. - List each booking with its time in the user's time zone, title, attendees and status. Call
caly:get_bookingonly when the user wants one booking's details.
Rescheduling
- Identify exactly one booking and its
uid. If several match, list them and ask which one. - Call
caly:find_available_slotsfor its event type and the new day, passingbookingUidToReschedule. Use only a start time from the result. - Confirm with the user: the booking, the old time, the new time (in the user's and the attendee's time zone), and that Caly will notify the attendees. Wait for an explicit yes.
- Call
caly:reschedule_bookingonce. Report the new time and the newuid.
Cancelling
- Identify exactly one booking and its
uid, and ask for a reason if the user has one. - Call
caly:cancel_bookingwith thebookingUid(andcancellationReason). The first call does not cancel: it returnsCONFIRMATION_REQUIREDwith aconfirmToken. - Show the user which booking will be cancelled (title, time, attendees) and that the attendees will be emailed. Wait for an explicit yes.
- Call
caly:cancel_bookingagain with the SAME arguments plus theconfirmToken. Report that it is cancelled.
Rules
- Never reschedule or cancel without the user's explicit yes to a summary that names the booking.
- Never pass a
confirmTokenthe user has not seen the booking for, and never reuse one for a different booking. - Set
cancelSubsequentBookingsonly when the user clearly asks to cancel the rest of a recurring series. - Always state the time zone next to every time you show.
