{"serverInfo":{"name":"WhenMeet.me","title":"WhenMeet.me","version":"1.1.0"},"description":"Group meeting scheduler: rank times everyone is free across Google & Outlook, create Meet (Google) or Teams (Teams-enabled M365 work/school) meetings, book and manage booking links.","protocolVersion":"2025-06-18","supportedProtocolVersions":["2025-06-18","2025-03-26","2024-11-05"],"documentationUrl":"https://whenmeet.me/docs#mcp","iconUrl":"https://whenmeet.me/favicon.svg","transport":{"type":"streamable-http","url":"https://whenmeet.me/mcp"},"capabilities":{"tools":{"listChanged":false}},"authentication":{"required":true,"schemes":["oauth2","bearer"],"protectedResourceMetadata":"https://whenmeet.me/.well-known/oauth-protected-resource/mcp","scopes":["read","write"]},"tools":[{"name":"find_common_slots","title":"Find common free times","description":"Rank the best meeting times for the given participants, merging live Google/Microsoft calendar data, hand-marked availability and the heat-map sources. Each participant is filtered (Mon–Fri, waking hours) and scored in their OWN timezone; scores factor in buffer time around existing meetings and prefer sooner slots. Returns up to 8 slots: everyone-free slots first (allFree:true), then — only if there are too few — the best compromise slots (allFree:false) with a freeCount. Defaults to the next 14 days; the window may end at most 60 days from now (bad_window). Up to 50 participants; reading other people’s connected calendars is limited to 30 new addresses per hour and 50 per day (lookup_limit), and each read is shown to the calendar owner.","annotations":{"title":"Find common free times","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}},{"name":"create_meeting","title":"Create a meeting","description":"Confirm a meeting: writes the event into the authenticated host’s calendar with an optional Google Meet link (Google calendars) or Teams link (Teams-enabled Microsoft 365 work/school accounts), emails invites with an ICS attachment, and returns the share URL (/m/<id>). Up to 50 participants; the start must be at most 60 days ahead (bad_window).","annotations":{"title":"Create a meeting","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}},{"name":"get_meeting","title":"Get a meeting","description":"Read a meeting by its share-link id (the UUID from /m/<id>): time, title, conference URL, host, and any proposed alternate times with their status.","annotations":{"title":"Get a meeting","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_meeting_availability","title":"Group availability for a meeting","description":"Aggregated group availability for an existing meeting (the symmetric heat-map): per-30-min-slot counts of how many participants are free, plus ranked slots (per-participant timezones, buffer + soonness scoring, allFree:true everyone-free slots and allFree:false compromise slots). Individual calendars are never exposed.","annotations":{"title":"Group availability for a meeting","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"suggest_time","title":"Suggest a different time","description":"Propose a different time for an existing meeting using your account email or a connected-calendar address. The host is notified by email and can accept or decline. Limits include 20 attempts per meeting/actor/hour, 30 successful suggestions per meeting/hour, 5 successful suggestions per meeting/actor/hour and 10 per actual uid or IP/hour; beyond that the tool returns rate_limited.","annotations":{"title":"Suggest a different time","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}},{"name":"respond_to_suggestion","title":"Accept or decline a suggested time","description":"Accept or decline a proposed alternate time. Accepting moves the meeting (calendar event included) and re-sends invites. Only the meeting host may call this.","annotations":{"title":"Accept or decline a suggested time","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}},{"name":"set_manual_availability","title":"Mark free time by hand","description":"Publish hand-marked FREE time slots for an email address (the no-calendar fallback, e.g. Apple iCloud users). Replaces previously marked slots inside the window. Only one of YOUR addresses (account email, a connected calendar, a team address you joined) goes live right away, for everyone — then the result is {ok, saved, free, busy} and the group heat-map updates immediately. For any other address nothing is published yet: the result is {ok: true, pending: true} and that person gets an email to confirm (confirmation emails are limited per day: 3 per address and 20 in total for your account; beyond that the call fails with rate_limited). To collect someone else's times, send them an ask-link instead (the picker's \"Copy ask-link\").","annotations":{"title":"Mark free time by hand","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true}},{"name":"get_manual_availability","title":"Read hand-marked free time","description":"Read previously hand-marked free slots for an email within a window.","annotations":{"title":"Read hand-marked free time","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"list_my_meetings","title":"List my meetings","description":"Everything on your plate in one list: group meetings you organize or are invited to (under one of your own addresses) and bookings on your links. Each item has kind (group / booking), id, title, start/end (ISO), status, role and links. scope upcoming (default) or past; kind group / booking narrows it; paginate with limit (≤ 100) and the returned nextCursor.","annotations":{"title":"List my meetings","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"list_my_event_types","title":"List my booking links","description":"Your own booking link and its link types: profile (nickname, timezone, weekly hours), publicUrl (whenmeet.me/@nickname), and eventTypes[] with url, duration, settings and — for team links — mode (\"all\" = everyone must be free, \"any\" = whoever is free, in turn) and members with their status. Zero-config: if you have a calendar connected but never opened /links, this provisions the default 30-minute link first (idempotent), so the link is live.","annotations":{"title":"List my booking links","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_booking_slots","title":"Get bookable times on a booking link","description":"Bookable times on someone’s WhenMeet.me booking link (whenmeet.me/@nickname[/slug]) — personal or team link. Returns the link (title, durationMin, required questions, team mode), the host’s timezone and slots[{start,end,othersFree,othersTotal}]. Only times and counts are ever exposed, never anyone’s calendar. othersFree/othersTotal also show which slots suit YOUR calendar and the optional guests (othersFree === othersTotal = good for everyone). Defaults to the next 14 days.","annotations":{"title":"Get bookable times on a booking link","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"book_slot","title":"Book a time on a booking link","description":"Book a time on someone’s WhenMeet.me booking link. startsAt must be a slot start from get_booking_slots. Writes the event to the host’s calendar (Google Meet link for Google hosts, Teams link for Teams-enabled Microsoft 365 work/school hosts, added automatically), emails invites with an ICS to you, your guests and the host (or the team), and returns bookingId, conferenceUrl, meetingUrl and manageUrl (cancel / reschedule). name/email default to the authenticated user. email, when supplied, must be the account email or a connected-calendar address; put other people under guests.","annotations":{"title":"Book a time on a booking link","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}},{"name":"list_my_bookings","title":"List my bookings","description":"Bookings made on your booking links (and team links you are on): upcoming by default, or past with scope \"past\". Each has id, status (confirmed / cancelled), startsAt/endsAt, eventTitle, invitee, guests, answers, notes, assignedTo, meetingUrl and canModify (owner, organizer or the assigned teammate may cancel / reschedule). At most 100 per call.","annotations":{"title":"List my bookings","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"cancel_booking","title":"Cancel a booking","description":"Cancel a booking by its id (from list_my_bookings or book_slot): deletes the calendar event and emails everyone a cancellation. Allowed for the link owner, the organizer who booked it, the assigned teammate, or with the invitee’s manage token (the t= value of manageUrl). Already cancelled → already_cancelled; started → too_late.","annotations":{"title":"Cancel a booking","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true}},{"name":"reschedule_booking","title":"Reschedule a booking","description":"Move a booking to a new start (same duration): the calendar event moves and everyone gets the updated invite. startsAt must be a free time on the booking’s link — pass from/to first with startsAt omitted to get the bookable times for this booking (its own hold doesn’t block). Same permissions as cancel_booking.","annotations":{"title":"Reschedule a booking","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}}]}