sync

Check availability, book meetings and find group times — without sharing your calendar.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
100%
Naming quality
92%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~2,034Tokens (tool definitions)
~3.1 KBTypical response size
Moderate attention impact (1.59% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "sync": {
      "url": "https://sync.lucie.network/api/mcp"
    }
  }
}

Remote endpoints

https://sync.lucie.network/api/mcpstreamable-http

What it can do

Tool inventory

Tools (5)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢check_availability(handle, durationMinutes, viewerTimeZone, from, to)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "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."
    },
    "durationMinutes": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "description": "Desired meeting length in minutes. Must be one the host offers. Defaults to 30 if omitted."
    },
    "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."
    },
    "from": {
      "type": "string",
      "description": "ISO-8601 start of the search window. Defaults to now + the host's minimum notice."
    },
    "to": {
      "type": "string",
      "description": "ISO-8601 end of the search window. Defaults to the host's max-advance horizon."
    }
  },
  "required": [
    "handle"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢book_meeting(handle, startAt, durationMinutes, bookerName, bookerEmail, ...)

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).

Input Schema

{
  "type": "object",
  "properties": {
    "handle": {
      "type": "string",
      "description": "The host's booking handle, e.g. \"@alice\" or \"alice\" (the leading @ is optional)."
    },
    "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."
    },
    "durationMinutes": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "description": "Meeting length in minutes. Must be one the host offers."
    },
    "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."
    },
    "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."
    },
    "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."
    }
  },
  "required": [
    "handle",
    "startAt",
    "durationMinutes",
    "bookerName",
    "bookerEmail",
    "reason"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢find_group_times(handles, durationMinutes, viewerTimeZone, from, to)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "handles": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "minItems": 1,
      "maxItems": 8,
      "description": "The participants' booking handles, e.g. [\"@alice\", \"@bob\"]. The leading @ is optional."
    },
    "durationMinutes": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "description": "Meeting length in minutes. Must be one every participant offers. Defaults to 30."
    },
    "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."
    },
    "from": {
      "type": "string",
      "description": "ISO-8601 start of the search window."
    },
    "to": {
      "type": "string",
      "description": "ISO-8601 end of the search window."
    }
  },
  "required": [
    "handles"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟡create_group_event(title, handles, organizerName, organizerEmail, durationMinutes, ...)

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).

Input Schema

{
  "type": "object",
  "properties": {
    "title": {
      "type": "string",
      "minLength": 1,
      "description": "The meeting title, e.g. \"Q3 planning sync\"."
    },
    "handles": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "minItems": 1,
      "maxItems": 8,
      "description": "Participants' @handles whose availability seeds the candidate times. The leading @ is optional."
    },
    "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",
      "exclusiveMinimum": 0,
      "description": "Meeting length in minutes. Defaults to 30."
    },
    "timeZone": {
      "type": "string",
      "description": "IANA time zone for the poll's displayed times, e.g. \"America/New_York\". Defaults to UTC."
    },
    "from": {
      "type": "string",
      "description": "ISO-8601 start of the search window."
    },
    "to": {
      "type": "string",
      "description": "ISO-8601 end of the search window."
    }
  },
  "required": [
    "title",
    "handles",
    "organizerName",
    "organizerEmail"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢book_group_meeting(participantHandles, startAt, durationMinutes, title, reason)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "participantHandles": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "minItems": 1,
      "maxItems": 8,
      "description": "The other participants' @handles, e.g. [\"@lucie\", \"@taylor\"]. Each must have a live Lucie booking page. Leading @ optional."
    },
    "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",
      "exclusiveMinimum": 0,
      "description": "Meeting length in minutes. Must be one the organizer offers."
    },
    "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."
    }
  },
  "required": [
    "participantHandles",
    "startAt",
    "durationMinutes",
    "title",
    "reason"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded5 tools