Kalender Sync
Server Details
GDPR-compliant calendar access for AI assistants: read, create, edit, RSVP. Google, MS 365, Apple.
- Status
- Healthy
- Uptime
- 99.9% over 58 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 8 tools
Each tool targets a distinct action-resource: create/update/delete_event, get_availability, list_calendars, search_events, respond_to_event, send_feedback. The only mild overlap is get_availability vs search_events (both surface events), but their descriptions clearly separate busy-time queries from text search.
All eight tools follow a clean snake_case verb_noun convention (create_event, delete_event, get_availability, list_calendars, respond_to_event, search_events, send_feedback, update_event). No mixing of conventions or vague verbs.
Eight tools is well-scoped for a calendar-sync server, covering the full event lifecycle plus calendar listing, invitation responses, and feedback. No redundant or filler tools.
Full CRUD on events (create/read/update/delete), invitation handling, calendar listing, and search are all present, covering the core workflows. Minor gaps exist (e.g. no explicit get_event by id or calendar-level management operations), but the surface has no serious dead ends.
Available Tools
8 toolscreate_eventCreate eventInspect
Creates an event in one of the calendars this access may write to.
Availability in the requested slot is checked LIVE (not from cache). An overlapping event does NOT prevent creation — the event is created regardless and the overlap comes back as a warning. Pass that warning on to the user instead of silently double-booking; whether the overlap is intended is the user's call.
The check counts only events that BLOCK the time (blocks_time: true in get_availability). Entries that do not block it — holidays, birthdays, and every all-day event from Apple/iCloud — are deliberately not reported as conflicts, because otherwise every booking on a day carrying a holiday would look like a clash. So no warning does NOT mean the day is empty: an all-day "Baustelle Darmstadt" is a working day that will not show up here. When the user asks to book on a specific day, check the day with get_availability first and mention what is already on it.
All-day events: pass bare dates (start: "2026-09-01", end: "2026-09-03") or set all_day: true. For all-day the end date is INCLUSIVE — that example creates a three-day event covering 1–3 September. Both ends must use the same form.
calendar_id is only needed when several calendars are writable; with exactly one, that one is used. list_calendars shows the writable calendars. title is required.
Check status first: credits_exhausted means this call was NOT performed. Only warnings and credit information are returned in that case; no result data or write confirmation. Tell the user how to restore credits; do not retry automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | End — same form as `start`. For all-day events this date is INCLUSIVE (end 2026-09-03 means the event runs through 3 September). | |
| start | Yes | Start — either an ISO 8601 timestamp WITH timezone (2026-07-28T10:00:00+02:00 or …Z), or a bare date (2026-07-28) for an all-day event. A timestamp without a zone is rejected. | |
| title | Yes | Event title (required) | |
| all_day | No | Force an all-day event; time components in start/end are then discarded. Not needed when start/end are already bare dates. | |
| location | No | ||
| time_zone | No | IANA zone, e.g. America/New_York. For timed events it preserves the NAMED zone so the event follows daylight saving (without it the event is stored as UTC and shows as GMT in Apple Calendar, and a recurring series will not shift with the clocks). For all-day events it decides which local day is covered. Always send it when you know the user's zone; defaults to UTC. | |
| calendar_id | No | Target calendar; only needed when several are writable | |
| description | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | ok: tool executed; use its result fields. credits_exhausted: not executed; no result fields. |
| warning | No | |
| event_id | No | |
| warnings | No | |
| resets_at | No | |
| calendar_id | No | |
| calendar_name | No | |
| credits_required | No | |
| credits_available | No |
delete_eventDelete eventDestructiveInspect
Deletes an event. The deletion is executed at the provider and propagates into any mirrored calendars through the normal sync.
Addressable are events THIS access created, and — where the user allowed managing (manageable: true in list_calendars) — any other event in that calendar.
Deleting is the irreversible one: confirm with the user first when the event is not one this access created, and say what it is (title and time) so they can recognise it. When the event has other participants, deleting it as the organiser cancels it for them too — mention that before doing it.
The same four refusals as update_event apply, each naming the way forward. For an invitation someone else organised, respond_to_event is the right tool: deleting it would only hide it locally and leave the organiser expecting the user.
Check status first: credits_exhausted means this call was NOT performed. Only warnings and credit information are returned in that case; no result data or write confirmation. Tell the user how to restore credits; do not retry automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| event_id | Yes | Identifier from create_event | |
| calendar_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | ok: tool executed; use its result fields. credits_exhausted: not executed; no result fields. |
| deleted | No | |
| event_id | No | |
| warnings | No | |
| resets_at | No | |
| calendar_id | No | |
| credits_required | No | |
| credits_available | No |
get_availabilityGet availabilityRead-onlyInspect
Returns the user's busy times in a given range, across all calendars shared with this access.
How the answer is produced: every shared calendar is read directly at the provider and the results are merged. There is no detour through a copy. as_of per calendar says when it was read — reads are reused for up to 60 seconds, so an event created moments ago may briefly be missing.
What busy contains: every event in the range, including all-day events and ones marked "tentative". Cancelled events are not included.
blocks_time per entry says whether it actually occupies the time. It is false for entries that do not make the user unavailable — holidays, birthdays, and (importantly) ALL all-day events from Apple/iCloud, which that provider always marks as free with no setting for the user to change. Such an entry is still a real appointment: an all-day "Baustelle Darmstadt" is a working day, not free time.
Use it accordingly: for "am I free / find me a slot", count only blocks_time: true. For "what do I have on", list everything and let the user judge. Never present a blocks_time: false entry as nonexistent.
Completeness: the answer covers exactly the calendars the user shared — not necessarily all calendars they own. If one of them could not be read, it appears with read: false in sources and additionally in warnings. These limitations belong in your answer to the user.
Check status first: credits_exhausted means this call was NOT performed. Only warnings and credit information are returned in that case; no result data or write confirmation. Tell the user how to restore credits; do not retry automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | End of the range, ISO 8601 | |
| from | Yes | Start of the range, ISO 8601 (e.g. 2026-07-21T00:00:00Z) |
Output Schema
| Name | Required | Description |
|---|---|---|
| busy | No | |
| range | No | |
| status | Yes | ok: tool executed; use its result fields. credits_exhausted: not executed; no result fields. |
| sources | No | |
| warnings | No | |
| resets_at | No | |
| range_clamped | No | |
| credits_required | No | |
| credits_available | No |
list_calendarsList calendarsRead-onlyInspect
Lists the calendars shared with this access, each with the detail level the user allowed. This tool costs no credits and works even at zero balance. Credit warnings concern the other calendar tools, not this calendar list.
readable: false means this calendar cannot be read right now — its events are also missing from get_availability. Such calendars are deliberately listed rather than omitted.
writable: true means this access may create events there. When more than one calendar is writable, create_event requires the calendar_id of one of them.
notice, when present, describes something the USER can change — either about this access or about their Kalender Sync setup. Pass it on rather than concluding the product cannot do what was asked. When it reads as an offer rather than an answer to what was asked, use your judgement about whether it fits the moment.
sync_health describes Kalender Sync's OWN synchronisation of this calendar, if it takes part in one. It does not affect availability answers (those read the provider directly), but a broken sync is something the user can fix.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| notice | No | |
| warnings | No | |
| calendars | Yes |
respond_to_eventAnswer an invitationDestructiveInspect
Accepts, declines or tentatively accepts an invitation someone else sent the user. The organiser is notified — that is the point: removing an invitation from the calendar without answering leaves them expecting the user.
The event_id comes from get_availability, for a calendar the user allowed managing (manageable: true in list_calendars).
Everything needed is in the get_availability or search_events result — pass event_id AND calendar_id straight back, and read is_recurring and is_organizer from the same entry instead of asking the user about them.
When is_recurring is true, set scope: "occurrence" answers only that date, "series" answers all of them. If the user named a date ("on Tuesday"), that IS "occurrence" — do not ask. Ask only when they named none, because declining one date and declining a standing commitment are different messages to the organiser.
Refusals name the way forward; pass them on rather than retrying.
Check status first: credits_exhausted means this call was NOT performed. Only warnings and credit information are returned in that case; no result data or write confirmation. Tell the user how to restore credits; do not retry automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | For a recurring appointment: answer only this date ("occurrence") or every date ("series"). Required as soon as the appointment repeats. | |
| comment | No | Optional note for the organiser, sent with the answer | |
| event_id | Yes | The `event_id` from get_availability or search_events | |
| response | Yes | The answer to send to the organiser | |
| calendar_id | No | The `calendar_id` that came back beside the event. Always pass it — it is in the same result, and leaving it out costs a round trip whenever more than one calendar is available. |
Output Schema
| Name | Required | Description |
|---|---|---|
| needs | No | |
| scope | No | |
| title | No | |
| status | Yes | ok: tool executed; use its result fields. credits_exhausted: not executed; no result fields. |
| event_id | No | |
| question | No | |
| response | No | |
| warnings | No | |
| resets_at | No | |
| credits_required | No | |
| credits_available | No |
search_eventsSearch eventsRead-onlyInspect
Finds events by text across the calendars shared with this access — case-insensitive substring match on title, location and description.
The search only sees what this access may see: it filters the same visibility-rendered data get_availability returns. Calendars limited to free/busy expose no text and therefore can never match — when such calendars are part of this access, a warning says so. "No match" is thus NOT proof that no such event exists.
A match in a calendar the user allowed managing carries event_id, calendar_id, is_organizer and is_recurring — everything update_event, delete_event and respond_to_event need. Act on those directly instead of calling get_availability again for the same appointment.
The range works like get_availability (single span of at most 92 days, lookback bounded to one year). Without from/to the search covers the last 7 days plus the next 85. Cancelled events are not searchable.
Matches include events that do not block time (blocks_time: false) — notably every all-day event from Apple/iCloud. They are ordinary appointments and belong in the answer; do not filter them out when the user asked what is in their calendar.
Check status first: credits_exhausted means this call was NOT performed. Only warnings and credit information are returned in that case; no result data or write confirmation. Tell the user how to restore credits; do not retry automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End of the range, ISO 8601. Default: 85 days ahead. | |
| from | No | Start of the range, ISO 8601. Default: 7 days ago. | |
| query | Yes | Text to look for (case-insensitive substring) |
Output Schema
| Name | Required | Description |
|---|---|---|
| range | No | |
| status | Yes | ok: tool executed; use its result fields. credits_exhausted: not executed; no result fields. |
| matches | No | |
| sources | No | |
| warnings | No | |
| resets_at | No | |
| truncated | No | |
| range_clamped | No | |
| credits_required | No | |
| credits_available | No | |
| unsearchable_calendars | No |
send_feedbackSend feedback to Kalender SyncDestructiveInspect
Stores a feedback message from the user and notifies the Kalender Sync team, who read it. Use it when the user wanted something the other tools in this connection cannot do, or when something looks broken. It does not change anything in the user's calendars and does not fix the problem itself; it returns a feedback_id as receipt. The notification email cannot be recalled after sending. At most 5 messages per account in 24 hours.
Call this ONLY when the user explicitly asked to send feedback, or clearly agreed after you offered it. Never send feedback on your own initiative, and never include calendar content the user did not put into the message themselves.
contact_ok records whether the user agrees to be contacted about this feedback. It is consent, not a promise of a reply. Default: false for every category, including bug. Set it to true ONLY if the user explicitly agreed to be contacted about this feedback. It never subscribes the user to a newsletter.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | The user's feedback in their own words (what they wanted, what happened). | |
| category | Yes | missing_capability: the user wanted something the tools cannot do. bug: something misbehaved. other: everything else. | |
| contact_ok | No | Does the user agree to be contacted about this feedback? Omit to use the default: false for every category. Set true only if the user explicitly agreed to be contacted about this feedback. |
Output Schema
| Name | Required | Description |
|---|---|---|
| received | Yes | |
| feedback_id | Yes |
update_eventUpdate eventDestructiveInspect
Updates an event. title, start and end describe the complete new state — including whether it is all-day: an event created all-day becomes a timed event if this call passes timestamps, and vice versa.
Two kinds of event are addressable:
Events THIS access created (via
event_idfrom create_event) — always.Any other event in a calendar the user allowed managing, visible in
list_calendarsasmanageable: true. Their ids come fromget_availability.
Four things are refused, and each says what to do instead — pass that on rather than retrying:
• the calendar is not released for managing (the user can allow it per calendar)
• it is shared at less than full detail (a setting, not a temporary error)
• the event is a synchronised COPY — change the original in the named source calendar, the change reaches this one by itself
• someone else organises it — call respond_to_event with response: "declined" and the same event_id instead
Check status first: credits_exhausted means this call was NOT performed. Only warnings and credit information are returned in that case; no result data or write confirmation. Tell the user how to restore credits; do not retry automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | New end — same form as `start`; INCLUSIVE for all-day events. | |
| start | Yes | New start — ISO 8601 with timezone (…+02:00 or …Z), or a bare date (2026-07-28) for an all-day event. | |
| title | Yes | ||
| all_day | No | Force an all-day event; time components in start/end are discarded. | |
| event_id | Yes | Identifier from create_event | |
| location | No | ||
| time_zone | No | IANA zone, e.g. America/New_York. Preserves the named zone for timed events (so recurrences follow daylight saving) and decides the local day for all-day ones. Defaults to UTC. | |
| calendar_id | No | ||
| description | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | ok: tool executed; use its result fields. credits_exhausted: not executed; no result fields. |
| updated | No | |
| event_id | No | |
| warnings | No | |
| resets_at | No | |
| calendar_id | No | |
| credits_required | No | |
| credits_available | No |
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Changed
send_feedback1 field changed- changed
Input schema / properties / contact_ok / descriptionPrevious value: -"Does the user agree to be contacted about this feedback? Omit to use the default: yes for `bug`, no for the other categories. Set false if the user declined contact, true if the user asked for it."New value: +"Does the user agree to be contacted about this feedback? Omit to use the default: false for every category. Set true only if the user explicitly agreed to be contacted about this feedback."
7 tool updates
- Changed
create_event6 fields changed- added
Output schema / properties / credits_availableAdded value: +{ + "type": "number" +} - added
Output schema / properties / credits_requiredAdded value: +{ + "type": "number" +} - added
Output schema / properties / resets_atAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / statusAdded value: +{ + "description": "ok: tool executed; use its result fields. credits_exhausted: not executed; no result fields.", + "enum": [ + "ok", + "credits_exhausted" + ], + "type": "string" +} - added
Output schema / properties / warningsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - changed
Output schema / requiredPrevious value: -[ - "event_id", - "calendar_id" -]New value: +[ + "status" +]
- Changed
delete_event6 fields changed- added
Output schema / properties / credits_availableAdded value: +{ + "type": "number" +} - added
Output schema / properties / credits_requiredAdded value: +{ + "type": "number" +} - added
Output schema / properties / resets_atAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / statusAdded value: +{ + "description": "ok: tool executed; use its result fields. credits_exhausted: not executed; no result fields.", + "enum": [ + "ok", + "credits_exhausted" + ], + "type": "string" +} - added
Output schema / properties / warningsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - changed
Output schema / requiredPrevious value: -[ - "event_id", - "calendar_id", - "deleted" -]New value: +[ + "status" +]
- Changed
get_availability5 fields changed- added
Output schema / properties / credits_availableAdded value: +{ + "type": "number" +} - added
Output schema / properties / credits_requiredAdded value: +{ + "type": "number" +} - added
Output schema / properties / resets_atAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / statusAdded value: +{ + "description": "ok: tool executed; use its result fields. credits_exhausted: not executed; no result fields.", + "enum": [ + "ok", + "credits_exhausted" + ], + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "range", - "range_clamped", - "busy", - "sources", - "warnings" -]New value: +[ + "status" +]
- Changed
list_calendars1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
respond_to_event5 fields changed- added
Output schema / properties / credits_availableAdded value: +{ + "type": "number" +} - added
Output schema / properties / credits_requiredAdded value: +{ + "type": "number" +} - added
Output schema / properties / resets_atAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / statusAdded value: +{ + "description": "ok: tool executed; use its result fields. credits_exhausted: not executed; no result fields.", + "enum": [ + "ok", + "credits_exhausted" + ], + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "event_id", - "response" -]New value: +[ + "status" +]
- Changed
search_events5 fields changed- added
Output schema / properties / credits_availableAdded value: +{ + "type": "number" +} - added
Output schema / properties / credits_requiredAdded value: +{ + "type": "number" +} - added
Output schema / properties / resets_atAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / statusAdded value: +{ + "description": "ok: tool executed; use its result fields. credits_exhausted: not executed; no result fields.", + "enum": [ + "ok", + "credits_exhausted" + ], + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "range", - "range_clamped", - "matches", - "truncated", - "unsearchable_calendars", - "sources", - "warnings" -]New value: +[ + "status" +]
- Changed
update_event6 fields changed- added
Output schema / properties / credits_availableAdded value: +{ + "type": "number" +} - added
Output schema / properties / credits_requiredAdded value: +{ + "type": "number" +} - added
Output schema / properties / resets_atAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / statusAdded value: +{ + "description": "ok: tool executed; use its result fields. credits_exhausted: not executed; no result fields.", + "enum": [ + "ok", + "credits_exhausted" + ], + "type": "string" +} - added
Output schema / properties / warningsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - changed
Output schema / requiredPrevious value: -[ - "event_id", - "calendar_id", - "updated" -]New value: +[ + "status" +]
1 tool update
- Changed
send_feedback1 field changed- changed
Input schema / properties / contact_ok / descriptionPrevious value: -"May the team send one reply about this feedback? Omit to use the default: yes for `bug`, no for the other categories. Set false if the user declined a reply, true if the user asked for one."New value: +"Does the user agree to be contacted about this feedback? Omit to use the default: yes for `bug`, no for the other categories. Set false if the user declined contact, true if the user asked for it."
2 tool updates
- Changed
get_availability2 fields changed- added
Output schema / properties / busy / items / properties / blocks_timeAdded value: +{ + "type": "boolean" +} - changed
Output schema / properties / busy / items / requiredPrevious value: -[ - "start", - "end", - "is_all_day", - "calendar_id", - "calendar_name" -]New value: +[ + "start", + "end", + "is_all_day", + "blocks_time", + "calendar_id", + "calendar_name" +]
- Changed
search_events2 fields changed- added
Output schema / properties / matches / items / properties / blocks_timeAdded value: +{ + "type": "boolean" +} - changed
Output schema / properties / matches / items / requiredPrevious value: -[ - "start", - "end", - "is_all_day", - "calendar_id", - "calendar_name" -]New value: +[ + "start", + "end", + "is_all_day", + "blocks_time", + "calendar_id", + "calendar_name" +]
4 tool updates
- Changed
get_availability6 fields changed- added
Output schema / properties / busy / items / properties / attendeesAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "email": { + "type": "string" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + }, + "organizer": { + "type": "boolean" + }, + "self": { + "type": "boolean" + }, + "status": { + "enum": [ + "accepted", + "declined", + "tentative", + "needs_action" + ], + "type": "string" + } + }, + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / busy / items / properties / event_idAdded value: +{ + "type": "string" +} - added
Output schema / properties / busy / items / properties / has_other_attendeesAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / busy / items / properties / is_organizerAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / busy / items / properties / is_recurringAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / busy / items / properties / more_attendeesAdded value: +{ + "type": "number" +}
- Changed
list_calendars2 fields changed- added
Output schema / properties / calendars / items / properties / manageableAdded value: +{ + "type": "boolean" +} - changed
Output schema / properties / calendars / items / requiredPrevious value: -[ - "id", - "name", - "provider", - "visibility", - "readable", - "writable", - "sync_health" -]New value: +[ + "id", + "name", + "provider", + "visibility", + "readable", + "writable", + "manageable", + "sync_health" +]
- Added
respond_to_event - Changed
search_events6 fields changed- added
Output schema / properties / matches / items / properties / attendeesAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "email": { + "type": "string" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + }, + "organizer": { + "type": "boolean" + }, + "self": { + "type": "boolean" + }, + "status": { + "enum": [ + "accepted", + "declined", + "tentative", + "needs_action" + ], + "type": "string" + } + }, + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / matches / items / properties / event_idAdded value: +{ + "type": "string" +} - added
Output schema / properties / matches / items / properties / has_other_attendeesAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / matches / items / properties / is_organizerAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / matches / items / properties / is_recurringAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / matches / items / properties / more_attendeesAdded value: +{ + "type": "number" +}
2 tool updates
- Changed
create_event1 field changed- changed
Input schema / properties / time_zone / descriptionPrevious value: -"IANA zone (e.g. Europe/Brussels) deciding which local day an all-day event covers. Defaults to UTC. Ignored for timed events, which carry their own offset."New value: +"IANA zone, e.g. America/New_York. For timed events it preserves the NAMED zone so the event follows daylight saving (without it the event is stored as UTC and shows as GMT in Apple Calendar, and a recurring series will not shift with the clocks). For all-day events it decides which local day is covered. Always send it when you know the user's zone; defaults to UTC."
- Changed
update_event1 field changed- changed
Input schema / properties / time_zone / descriptionPrevious value: -"IANA zone deciding which local day an all-day event covers. Defaults to UTC."New value: +"IANA zone, e.g. America/New_York. Preserves the named zone for timed events (so recurrences follow daylight saving) and decides the local day for all-day ones. Defaults to UTC."
2 tool updates
- Changed
create_event4 fields changed- added
Input schema / properties / all_dayAdded value: +{ + "description": "Force an all-day event; time components in start/end are then discarded. Not needed when start/end are already bare dates.", + "type": "boolean" +} - changed
Input schema / properties / end / descriptionPrevious value: -"End, ISO 8601 with timezone"New value: +"End — same form as `start`. For all-day events this date is INCLUSIVE (end 2026-09-03 means the event runs through 3 September)." - changed
Input schema / properties / start / descriptionPrevious value: -"Start, ISO 8601 WITH timezone — e.g. 2026-07-28T10:00:00+02:00 or …Z. Rejected without a zone."New value: +"Start — either an ISO 8601 timestamp WITH timezone (2026-07-28T10:00:00+02:00 or …Z), or a bare date (2026-07-28) for an all-day event. A timestamp without a zone is rejected." - added
Input schema / properties / time_zoneAdded value: +{ + "description": "IANA zone (e.g. Europe/Brussels) deciding which local day an all-day event covers. Defaults to UTC. Ignored for timed events, which carry their own offset.", + "type": "string" +}
- Changed
update_event4 fields changed- added
Input schema / properties / all_dayAdded value: +{ + "description": "Force an all-day event; time components in start/end are discarded.", + "type": "boolean" +} - changed
Input schema / properties / end / descriptionPrevious value: -"New end, ISO 8601 with timezone"New value: +"New end — same form as `start`; INCLUSIVE for all-day events." - changed
Input schema / properties / start / descriptionPrevious value: -"New start, ISO 8601 with timezone (e.g. …+02:00 or …Z)"New value: +"New start — ISO 8601 with timezone (…+02:00 or …Z), or a bare date (2026-07-28) for an all-day event." - added
Input schema / properties / time_zoneAdded value: +{ + "description": "IANA zone deciding which local day an all-day event covers. Defaults to UTC.", + "type": "string" +}
2 tool updates
- Changed
get_availability1 field changed- added
Output schema / properties / sources / items / properties / retryableAdded value: +{ + "type": "boolean" +}
- Changed
search_events1 field changed- added
Output schema / properties / sources / items / properties / retryableAdded value: +{ + "type": "boolean" +}
1 tool update
- Changed
send_feedback1 field changed- changed
Input schema / properties / contact_ok / descriptionPrevious value: -"true ONLY if the user explicitly agreed to one reply about this feedback."New value: +"May the team send one reply about this feedback? Omit to use the default: yes for `bug`, no for the other categories. Set false if the user declined a reply, true if the user asked for one."
1 tool update
- Changed
list_calendars1 field changed- added
Output schema / properties / noticeAdded value: +{ + "type": "string" +}
1 tool update
- Changed
list_calendars2 fields changed- added
Output schema / properties / calendars / items / properties / writableAdded value: +{ + "type": "boolean" +} - changed
Output schema / properties / calendars / items / requiredPrevious value: -[ - "id", - "name", - "provider", - "visibility", - "readable", - "sync_health" -]New value: +[ + "id", + "name", + "provider", + "visibility", + "readable", + "writable", + "sync_health" +]
7 tool updates
- First observed
create_event - First observed
delete_event - First observed
get_availability - First observed
list_calendars - First observed
search_events - First observed
send_feedback - First observed
update_event
Related MCP Connectors
Calendar API for AI agents: events, availability, Google/Microsoft setup, scheduling, and iCal.
Gmail, Outlook, Drive, OneDrive and calendars for AI agents. Many accounts, one endpoint, audit log.
Scheduling infrastructure for AI agents across Google and Microsoft calendars.
Governed memory and workspace for any AI: tasks, calendar, mail and pages, with per-action consent.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to read, create, update, delete, and search Google Calendar events across multiple accounts, check availability, and handle recurring events and invitations through natural language.113 npmMIT
- FlicenseNot gradedqualityDmaintenanceProvides AI assistants with intelligent access to Google Calendar data, enabling natural language queries about availability, upcoming events, schedule conflicts, and meeting summaries through context-aware calendar integration.-
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to manage Google Calendar events, check availability, handle recurring events, and coordinate across multiple accounts and calendars through natural language.7,443 npmMIT
- AlicenseCqualityDmaintenanceEnables AI assistants to interact with Google Calendar through a simplified OAuth setup. Supports creating, editing, deleting, and searching calendar events without the complexity of Google Cloud Console configuration.417 npm4MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.