Check availability, book meetings and find group times — without sharing your calendar.
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.
Confirm a group meeting at a specific time across several Lucie hosts (by @handle), creating ONE shared Google Calendar event with everyone invited. YOU (the connector's owner) are the organizer and host the event on your calendar — no organizer handle needed. This is a real write: it re-verifies every participant (you included) is free at that instant and refuses if anyone isn't — so it never double-books. Always call find_group_times first and copy an exact common-slot start. Before calling, confirm the time (in each person's zone), the participants, the title, and the reason. Requires you to be on Sync Pro (or a Lucie Membership) via your personal connector; everyone must have a live booking page.
The meeting title, e.g. "Q3 planning sync".
A short agenda/purpose, shared with everyone on the invite.
The exact ISO-8601 `start` copied verbatim from a find_group_times common slot (absolute UTC instant). Do NOT construct it from a wall-clock time.
Meeting length in minutes. Must be one the organizer offers.
The other participants' @handles, e.g. ["@lucie", "@taylor"]. Each must have a live Lucie booking page. Leading @ optional.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Confirm a group meeting at a specific time across several Lucie hosts (by @handle), creating ONE shared Google Calendar event with everyone invited. YOU (the connector's owner) are the organizer and host the event on your calendar — no organizer handle needed. This is a real write: it re-verifies every participant (you included) is free at that instant and refuses if anyone isn't — so it never double-books. Always call find_group_times first and copy an exact common-slot start. Before calling, confirm the time (in each person's zone), the participants, the title, and the reason. Requires you to be on Sync Pro (or a Lucie Membership) via your personal connector; everyone must have a live booking page.
| Argument | Type | Description |
|---|---|---|
| title* | string | The meeting title, e.g. "Q3 planning sync". |
| reason* | string | A short agenda/purpose, shared with everyone on the invite. |
| startAt* | string | The exact ISO-8601 `start` copied verbatim from a find_group_times common slot (absolute UTC instant). Do NOT construct it from a wall-clock time. |
| durationMinutes* | integer | Meeting length in minutes. Must be one the organizer offers. |
| participantHandles* | array | The other participants' @handles, e.g. ["@lucie", "@taylor"]. Each must have a live Lucie booking page. Leading @ optional. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"participantHandles",
"startAt",
"durationMinutes",
"title",
"reason"
],
"properties": {
"title": {
"type": "string",
"minLength": 1,
"description": "The meeting title, e.g. \"Q3 planning sync\"."
},
"reason": {
"type": "string",
"minLength": 1,
"description": "A short agenda/purpose, shared with everyone on the invite."
},
"startAt": {
"type": "string",
"description": "The exact ISO-8601 `start` copied verbatim from a find_group_times common slot (absolute UTC instant). Do NOT construct it from a wall-clock time."
},
"durationMinutes": {
"type": "integer",
"description": "Meeting length in minutes. Must be one the organizer offers.",
"exclusiveMinimum": 0
},
"participantHandles": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 8,
"minItems": 1,
"description": "The other participants' @handles, e.g. [\"@lucie\", \"@taylor\"]. Each must have a live Lucie booking page. Leading @ optional."
}
},
"additionalProperties": false
}Book a confirmed meeting on a Lucie Sync host's calendar at a specific start time. This is a real write: it creates a calendar event and emails both the host and the booker. Always call check_availability first and use one of the open slots it returns. Before calling, (1) show the booker the specific date/time you're about to book — in their own time zone — and get their explicit confirmation, and (2) collect their name, email, AND a brief reason for the meeting (ask for the reason if not given; it's required and shared with the host).
| Argument | Type | Description |
|---|---|---|
| handle* | string | The host's booking handle, e.g. "@alice" or "alice" (the leading @ is optional). |
| reason* | string | A short description of why the booker wants to meet (the agenda / purpose). Required — ask the booker for it before booking. Shared with the host alongside the invite. |
| startAt* | string | The exact ISO-8601 `start` value copied verbatim from a check_availability slot (an absolute UTC instant, e.g. 2026-07-28T17:00:00Z). Do NOT construct this from a local wall-clock time the booker said — that risks the wrong time zone; always copy the slot's start. |
| bookerName* | string | Full name of the person the meeting is for (the booker). |
| bookerEmail* | string | The booker's email. The confirmation and calendar invite are sent here. |
| viewerTimeZone |
Return the open meeting slots a Lucie Sync host offers, plus their booking rules (durations offered, minimum notice, how far ahead you can book, buffer between meetings). Returns only bookable slots and policy — never the host's raw calendar. Use this to find a time before proposing one to the user. Slots are absolute instants (ISO-8601 UTC). Pass the booker's viewerTimeZone so times display in THEIR local zone — the booker should never have to do time-zone math.
| Argument | Type | Description |
|---|---|---|
| to | string | ISO-8601 end of the search window. Defaults to the host's max-advance horizon. |
| from | string | ISO-8601 start of the search window. Defaults to now + the host's minimum notice. |
| handle* | string | The host's booking handle, e.g. "@alice" or "alice" (from their lucie.network/book/@<handle> link). The leading @ is optional. |
| viewerTimeZone | string | The booker's IANA time zone, e.g. "Asia/Singapore" or "America/New_York". Pass the booker's own zone so slots are shown in their local time. Defaults to the host's zone if omitted. |
| durationMinutes | integer | Desired meeting length in minutes. Must be one the host offers. Defaults to 30 if omitted. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"handle"
],
"properties": {
"to": {
"type": "string",
"description": "ISO-8601 end of the search window. Defaults to the host's max-advance horizon."
},
"from": {
"type": "string",
"description": "ISO-8601 start of the search window. Defaults to now + the host's minimum notice."
},
"handle": {
"type": "string",
"description": "The host's booking handle, e.g. \"@alice\" or \"alice\" (from their lucie.network/book/@<handle> link). The leading @ is optional."
},
"viewerTimeZone": {
"type": "string",
"description": "The booker's IANA time zone, e.g. \"Asia/Singapore\" or \"America/New_York\". Pass the booker's own zone so slots are shown in their local time. Defaults to the host's zone if omitted."
},
"durationMinutes": {
"type": "integer",
"description": "Desired meeting length in minutes. Must be one the host offers. Defaults to 30 if omitted.",
"exclusiveMinimum": 0
}
},
"additionalProperties": false
}Create a Lucie group event (a poll) for several participants, pre-filled with candidate times when everyone is free (the intersection of their availability). Returns a vote link to share: participants pick which proposed times work, and people WITHOUT a Lucie handle can vote manually too. This is a write (creates a poll) but sends no emails and touches no calendars. Confirm the title, participants, and duration with the organizer before creating. Note: agent group scheduling is a Sync Pro feature — the organizer's email must be on Sync Pro (or a Lucie Membership).
| Argument | Type | Description |
|---|---|---|
| to | string | ISO-8601 end of the search window. |
| from | string | ISO-8601 start of the search window. |
| title* | string | The meeting title, e.g. "Q3 planning sync". |
| handles* | array | Participants' @handles whose availability seeds the candidate times. The leading @ is optional. |
| timeZone | string | IANA time zone for the poll's displayed times, e.g. "America/New_York". Defaults to UTC. |
| organizerName* | string | The organizer's name (shown on the poll). |
| organizerEmail* | string | The organizer's email. |
Given several Lucie hosts (by @handle), return the meeting times when ALL of them are free — the intersection of their availability — for a meeting of the given length. Read-only: never books, never exposes anyone's raw calendar (only the shared open slots). Use it to propose a group time. Times are absolute instants; pass viewerTimeZone so they show in the organizer's local zone.
| Argument | Type | Description |
|---|---|---|
| to | string | ISO-8601 end of the search window. |
| from | string | ISO-8601 start of the search window. |
| handles* | array | The participants' booking handles, e.g. ["@alice", "@bob"]. The leading @ is optional. |
| viewerTimeZone | string | The organizer's IANA time zone, e.g. "America/New_York". Common times are shown in this zone. Defaults to UTC. |
| durationMinutes | integer | Meeting length in minutes. Must be one every participant offers. Defaults to 30. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"handles"
],
"properties": {
"to": {
"type": "string",
"description": "ISO-8601 end of the search window."
},
"from": {
"type": "string",
"description": "ISO-8601 start of the search window."
},
"handles": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 8,
"minItems": 1,
"description": "The participants' booking handles, e.g. [\"@alice\", \"@bob\"]. The leading @ is optional."
},
"viewerTimeZone": {
"type": "string",
"description": "The organizer's IANA time zone, e.g. \"America/New_York\". Common times are shown in this zone. Defaults to UTC."
},
"durationMinutes": {
"type": "integer",
"description": "Meeting length in minutes. Must be one every participant offers. Defaults to 30.",
"exclusiveMinimum": 0
}
},
"additionalProperties": false
}| string |
| The BOOKER's IANA time zone (e.g. America/New_York) — the same one you passed to check_availability. Their confirmation email and reminders are written in this zone, so without it they read the host's zone instead and have to do the time-zone maths themselves. |
| durationMinutes* | integer | Meeting length in minutes. Must be one the host offers. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"handle",
"startAt",
"durationMinutes",
"bookerName",
"bookerEmail",
"reason"
],
"properties": {
"handle": {
"type": "string",
"description": "The host's booking handle, e.g. \"@alice\" or \"alice\" (the leading @ is optional)."
},
"reason": {
"type": "string",
"minLength": 1,
"description": "A short description of why the booker wants to meet (the agenda / purpose). Required — ask the booker for it before booking. Shared with the host alongside the invite."
},
"startAt": {
"type": "string",
"description": "The exact ISO-8601 `start` value copied verbatim from a check_availability slot (an absolute UTC instant, e.g. 2026-07-28T17:00:00Z). Do NOT construct this from a local wall-clock time the booker said — that risks the wrong time zone; always copy the slot's start."
},
"bookerName": {
"type": "string",
"description": "Full name of the person the meeting is for (the booker)."
},
"bookerEmail": {
"type": "string",
"format": "email",
"description": "The booker's email. The confirmation and calendar invite are sent here."
},
"viewerTimeZone": {
"type": "string",
"description": "The BOOKER's IANA time zone (e.g. America/New_York) — the same one you passed to check_availability. Their confirmation email and reminders are written in this zone, so without it they read the host's zone instead and have to do the time-zone maths themselves."
},
"durationMinutes": {
"type": "integer",
"description": "Meeting length in minutes. Must be one the host offers.",
"exclusiveMinimum": 0
}
},
"additionalProperties": false
}| durationMinutes | integer | Meeting length in minutes. Defaults to 30. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"title",
"handles",
"organizerName",
"organizerEmail"
],
"properties": {
"to": {
"type": "string",
"description": "ISO-8601 end of the search window."
},
"from": {
"type": "string",
"description": "ISO-8601 start of the search window."
},
"title": {
"type": "string",
"minLength": 1,
"description": "The meeting title, e.g. \"Q3 planning sync\"."
},
"handles": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 8,
"minItems": 1,
"description": "Participants' @handles whose availability seeds the candidate times. The leading @ is optional."
},
"timeZone": {
"type": "string",
"description": "IANA time zone for the poll's displayed times, e.g. \"America/New_York\". Defaults to UTC."
},
"organizerName": {
"type": "string",
"minLength": 1,
"description": "The organizer's name (shown on the poll)."
},
"organizerEmail": {
"type": "string",
"format": "email",
"description": "The organizer's email."
},
"durationMinutes": {
"type": "integer",
"description": "Meeting length in minutes. Defaults to 30.",
"exclusiveMinimum": 0
}
},
"additionalProperties": false
}