Find open times and book, reschedule or cancel meetings on anyone's Tempi link. No account needed.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Cancels a booking by its id and token. The event is removed from the host's calendar. Paid bookings cancelled before `refundableUntil` are refunded in full. Later cancellations get no refund. The event type sets the rules, which get_booking shows: no changes after `changeableUntil` (409 change_too_late), no cancelling when `canCancel` is false (409 cancel_not_allowed, reschedule instead).
the booking id from create_booking, or its manageUrl
the token from create_booking, or the manageUrl
why the invitee cancels, sent to the host
for a series: also cancel every later meeting
The server marks this tool as destructive. Running it may delete or overwrite data on the server or in any account you connected with your headers.
Cancels a booking by its id and token. The event is removed from the host's calendar. Paid bookings cancelled before `refundableUntil` are refunded in full. Later cancellations get no refund. The event type sets the rules, which get_booking shows: no changes after `changeableUntil` (409 change_too_late), no cancelling when `canCancel` is false (409 cancel_not_allowed, reschedule instead).
| Argument | Type | Description |
|---|---|---|
| id* | string | the booking id from create_booking, or its manageUrl |
| token* | string | the token from create_booking, or the manageUrl |
| reason | string | why the invitee cancels, sent to the host |
| following | boolean | for a series: also cancel every later meeting |
{
"type": "object",
"required": [
"id",
"token"
],
"properties": {
"id": {
"type": "string",
"description": "the booking id from create_booking, or its manageUrl"
},
"token": {
"type": "string",
"description": "the token from create_booking, or the manageUrl"
},
"reason": {
"type": "string",
"title": "maxLength(500)",
"maxLength": 500,
"minLength": 0,
"description": "why the invitee cancels, sent to the host"
},
"following": {
"type": "boolean",
"description": "for a series: also cancel every later meeting"
}
},
"additionalProperties": false
}For event types with `repeatMax` (from get_public_profile): lists each meeting of a series that starts at `start` (one of the slots) and repeats `every` 1, 2 or 4 weeks at the host's clock time, and whether each is free. Pass the invitee's `timezone` to get each meeting's `when` in it: where clocks change on other dates than the host's, some meetings move for the invitee, and `message` says which. Book it with create_booking and `repeat` when `bookable` is true. A series is booked whole or not at all, and round robin gives every meeting to the same host.
| Argument | Type | Description |
|---|---|---|
| slug* | string | an event type slug from get_public_profile ("demo" in meettempi.com/acme/demo), or the whole link |
| count* | any | how many meetings, first included (2 up to the event type's repeatMax) |
| every* | any | weeks between meetings: 1, 2 or 4 |
| start* | string | one of the `slots` values from get_available_slots, as given (ISO in UTC) |
| handle* | string | a handle, the first part of a booking link ("acme" in meettempi.com/acme/demo), or the whole link |
| timezone | string | the invitee's time zone, an IANA id like America/New_York or an abbreviation like EST: each meeting's `when` is in it |
Books `start`, which must be one of the `slots` from get_available_slots. Free events are confirmed at once, unless the event type has `requiresApproval`: then it's a request (status=pending_approval) that holds the time until a host approves or declines it, and the invitee hears either way by email. Nobody answering by its start (`holdExpiresAt`) lets it lapse. Tell the human it isn't confirmed yet. Paid events return status=pending_payment and a `paymentUrl`. Give it to the human to pay before `holdExpiresAt`, or the slot is released. Once confirmed, the event is added to the host's calendar if they connected one, and the invitee gets a confirmation email with a calendar file (.ics). Keep `manageUrl` and `token`: they are the only way to view, reschedule or cancel later. 409 slot_unavailable says why the time can't be booked and lists the `nearest` open times. The result's `when` is the start in the invitee's time zone, to tell them.
| Argument | Type | Description |
|---|---|---|
| name* | string | the invitee's full name |
| slug* | string | an event type slug from get_public_profile ("demo" in meettempi.com/acme/demo), or the whole link |
| cover | string | leave it out: the id of the painting the booking page showed, when the event type shows a different one each booking (cover "hand", "light" or "still"), so the booking keeps it. Anything else is ignored, and Tempi picks one |
| email* | string | the invitee's email address, which gets the confirmation and its calendar file |
| notes | string | anything the invitee wants the host to know |
Returns the start times that can be booked, with the hosts' calendars, buffers and limits already applied. Pass the invitee's `timezone` and either `date` (YYYY-MM-DD in `timezone`) or `from` and `to` (ISO, at most 62 days apart). With neither, it covers the next 7 days. `days` groups the slots by date in `timezone`, and `times` gives each slot as a local time to show people. People can book up to `bookableUntil`. When the range has no open times, `next` is the next one. When `timezone` was an abbreviation that names more than one zone (CST, IST, BST), `timezoneNote` says which one was used: check it with the person. For new times for an existing booking, also pass its `bookingId` and `token`. Next: call create_booking (or reschedule_booking_as_invitee) with one of the `slots` values as `start`.
| Argument | Type | Description |
|---|---|---|
| to | string | end of the range, ISO with an offset |
| date | string | one day to look at, as YYYY-MM-DD in `timezone` |
| from | string | start of the range, ISO with an offset |
| slug* | string | an event type slug from get_public_profile ("demo" in meettempi.com/acme/demo), or the whole link |
| token | string | the token from create_booking, or the manageUrl |
| handle* | string | a handle, the first part of a booking link ("acme" in meettempi.com/acme/demo), or the whole link |
Returns a booking by its id and token (from create_booking), or its manageUrl passed as both, with `changeableUntil`, `refundableUntil` and `canCancel`. For a series, `series` lists every meeting with its own manageUrl.
| Argument | Type | Description |
|---|---|---|
| id* | string | the booking id from create_booking, or its manageUrl |
| token* | string | the token from create_booking, or the manageUrl |
{
"type": "object",
"required": [
"id",
"token"
],
"properties": {
"id": {
"type": "string",
"description": "the booking id from create_booking, or its manageUrl"
},
"token": {
"type": "string",
"description": "the token from create_booking, or the manageUrl"
}
},
"additionalProperties": false
}Takes a handle, the first path segment of a booking link (https://host/acme/demo → "acme"), or the link itself. Returns the person or team and their bookable event types, with duration, price, and hosts with their time zones (`hostTimezones`, so you can say what time a slot is for them). A handle from before a rename also works. Next: call get_available_slots with one of the event type slugs.
| Argument | Type | Description |
|---|---|---|
| handle* | string | a handle, the first part of a booking link ("acme" in meettempi.com/acme/demo), or the whole link |
{
"type": "object",
"required": [
"handle"
],
"properties": {
"handle": {
"type": "string",
"description": "a handle, the first part of a booking link (\"acme\" in meettempi.com/acme/demo), or the whole link"
}
},
"additionalProperties": false
}Requests access to host on Tempi (create event types, share a booking page). Not needed to book meetings, since booking pages are public. Returns the status: pending, approved (sign in to the Tempi web app), rejected, or open (no waitlist, sign in directly). Joining again with the same email returns the current status.
| Argument | Type | Description |
|---|---|---|
| ref | string | a short source tag of lowercase letters, digits, - or _, like "embed" |
| name | string | the person’s name (at most 100 characters) |
| note | string | anything the admins should know, e.g. what you want to use Tempi for |
| email* | string | an email address |
{
"type": "object",
"required": [
"email"
],
"properties": {
"ref": {
"type": "string",
"pattern": "^[a-z0-9_-]{1,32}$",
"description": "a short source tag of lowercase letters, digits, - or _, like \"embed\""
},
"name": {
"type": "string",
"title": "maxLength(100)",
"maxLength": 100,
"minLength": 0,
"description": "the person’s name (at most 100 characters)"
},
"note": {
"type": "string",
"title": "maxLength(1000)",
"maxLength": 1000,
"minLength": 0,
"description": "anything the admins should know, e.g. what you want to use Tempi for"
},
"email": {
"type": "string",
"format": "email",
"description": "an email address"
}
},
"additionalProperties": false
}Moves a confirmed booking to `start` with the same hosts. Get valid times from get_available_slots with this `bookingId` and `token`. The calendar event is updated and its provider notifies attendees. Payment carries over. Not possible after `changeableUntil` (409 change_too_late). A request (status=pending_approval) can’t be moved: cancel it and request another time.
| Argument | Type | Description |
|---|---|---|
| id* | string | the booking id from create_booking, or its manageUrl |
| start* | string | one of the `slots` values from get_available_slots, as given (ISO in UTC) |
| token* | string | the token from create_booking, or the manageUrl |
{
"type": "object",
"required": [
"id",
"token",
"start"
],
"properties": {
"id": {
"type": "string",
"description": "the booking id from create_booking, or its manageUrl"
},
"start": {
"type": "string",
"format": "date-time",
"description": "one of the `slots` values from get_available_slots, as given (ISO in UTC)"
},
"token": {
"type": "string",
"description": "the token from create_booking, or the manageUrl"
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"handle",
"slug",
"start",
"every",
"count"
],
"properties": {
"slug": {
"type": "string",
"description": "an event type slug from get_public_profile (\"demo\" in meettempi.com/acme/demo), or the whole link"
},
"count": {
"anyOf": [
{
"type": "integer",
"title": "between(2, 52)",
"maximum": 52,
"minimum": 2,
"description": "how many meetings, first included (2 up to the event type's repeatMax)"
},
{
"type": "string",
"description": "a string to be decoded into a number"
}
],
"description": "how many meetings, first included (2 up to the event type's repeatMax)"
},
"every": {
"anyOf": [
{
"enum": [
1,
2,
4
],
"type": "number",
"description": "weeks between meetings: 1, 2 or 4"
},
{
"type": "string",
"description": "a string to be decoded into a number"
}
],
"description": "weeks between meetings: 1, 2 or 4"
},
"start": {
"type": "string",
"format": "date-time",
"description": "one of the `slots` values from get_available_slots, as given (ISO in UTC)"
},
"handle": {
"type": "string",
"description": "a handle, the first part of a booking link (\"acme\" in meettempi.com/acme/demo), or the whole link"
},
"timezone": {
"type": "string",
"description": "the invitee's time zone, an IANA id like America/New_York or an abbreviation like EST: each meeting's `when` is in it"
}
},
"additionalProperties": false
}| phone | string | the invitee's phone number with its country code, like +1 415 555 0134: required when the event type is a phone call (whereKind phone on get_public_profile), where the host calls them |
| start* | string | one of the `slots` values from get_available_slots, as given (ISO in UTC) |
| handle* | string | a handle, the first part of a booking link ("acme" in meettempi.com/acme/demo), or the whole link |
| repeat | object | book a series instead: `count` meetings, `every` 1, 2 or 4 weeks at the host's clock time, when the event type's repeatMax allows. All or nothing: check_series first. The result's `series.meetings` give each start as `when` in the invitee's time zone, and `series.clockNote` says when that moves |
| timezone* | string | the invitee's time zone, an IANA id like America/New_York or an abbreviation like EST: their emails and reminders show times in it |
{
"type": "object",
"required": [
"handle",
"slug",
"start",
"name",
"email",
"timezone"
],
"properties": {
"name": {
"type": "string",
"description": "the invitee's full name"
},
"slug": {
"type": "string",
"description": "an event type slug from get_public_profile (\"demo\" in meettempi.com/acme/demo), or the whole link"
},
"cover": {
"type": "string",
"title": "maxLength(40)",
"maxLength": 40,
"description": "leave it out: the id of the painting the booking page showed, when the event type shows a different one each booking (cover \"hand\", \"light\" or \"still\"), so the booking keeps it. Anything else is ignored, and Tempi picks one"
},
"email": {
"type": "string",
"format": "email",
"description": "the invitee's email address, which gets the confirmation and its calendar file"
},
"notes": {
"type": "string",
"title": "maxLength(2000)",
"maxLength": 2000,
"minLength": 0,
"description": "anything the invitee wants the host to know"
},
"phone": {
"type": "string",
"title": "maxLength(40)",
"maxLength": 40,
"minLength": 0,
"description": "the invitee's phone number with its country code, like +1 415 555 0134: required when the event type is a phone call (whereKind phone on get_public_profile), where the host calls them"
},
"start": {
"type": "string",
"format": "date-time",
"description": "one of the `slots` values from get_available_slots, as given (ISO in UTC)"
},
"handle": {
"type": "string",
"description": "a handle, the first part of a booking link (\"acme\" in meettempi.com/acme/demo), or the whole link"
},
"repeat": {
"type": "object",
"required": [
"every",
"count"
],
"properties": {
"count": {
"type": "integer",
"title": "between(2, 52)",
"maximum": 52,
"minimum": 2,
"description": "how many meetings, first included (2 up to the event type's repeatMax)"
},
"every": {
"enum": [
1,
2,
4
],
"type": "number",
"description": "weeks between meetings: 1, 2 or 4"
}
},
"description": "book a series instead: `count` meetings, `every` 1, 2 or 4 weeks at the host's clock time, when the event type's repeatMax allows. All or nothing: check_series first. The result's `series.meetings` give each start as `when` in the invitee's time zone, and `series.clockNote` says when that moves",
"additionalProperties": false
},
"timezone": {
"type": "string",
"description": "the invitee's time zone, an IANA id like America/New_York or an abbreviation like EST: their emails and reminders show times in it"
}
},
"additionalProperties": false
}| timezone* | string | the invitee's time zone, an IANA id like America/New_York or an abbreviation like EST: days, dates and times are in it |
| bookingId | string | the booking id from create_booking, or its manageUrl |
{
"type": "object",
"required": [
"handle",
"slug",
"timezone"
],
"properties": {
"to": {
"type": "string",
"format": "date-time",
"description": "end of the range, ISO with an offset"
},
"date": {
"type": "string",
"format": "date",
"description": "one day to look at, as YYYY-MM-DD in `timezone`"
},
"from": {
"type": "string",
"format": "date-time",
"description": "start of the range, ISO with an offset"
},
"slug": {
"type": "string",
"description": "an event type slug from get_public_profile (\"demo\" in meettempi.com/acme/demo), or the whole link"
},
"token": {
"type": "string",
"description": "the token from create_booking, or the manageUrl"
},
"handle": {
"type": "string",
"description": "a handle, the first part of a booking link (\"acme\" in meettempi.com/acme/demo), or the whole link"
},
"timezone": {
"type": "string",
"description": "the invitee's time zone, an IANA id like America/New_York or an abbreviation like EST: days, dates and times are in it"
},
"bookingId": {
"type": "string",
"description": "the booking id from create_booking, or its manageUrl"
}
},
"additionalProperties": false
}