leo-google-calendar-mcp
Syncs Google Calendar data into Leo's calendar provider, returning calendars and their events via a sync_user tool. Handles all-day event boundaries, skips cancelled or recurring instances, and preserves absent optional fields.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@leo-google-calendar-mcpsync my Google Calendar into Leo"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
leo-google-calendar-mcp
Google Calendar as a Leo calendar provider, over MCP. Fills the calendar
provider role; Leo's own calendar screen, agenda and search read what it syncs.
The contract
Tool | Arguments | Returns |
|
|
|
It touches no database and owns no OAuth app. The hub writes
calendar_events from what this returns, and mints an access token per call
from the Google account you already connected — so moving this package out of
Leo's binary costs you no re-authorization.
Calendars, not a flat event list. The hub sweeps events that vanished upstream, and that sweep is scoped to one calendar: a pass that read two calendars and failed on the third must not have the third's events taken as deleted. The shape carries that scope.
Related MCP server: Google-Calendar Universal MCP
What the tests pin
The Google API's errors are loud. A misread event is not — it lands as a real row on a real calendar, on the wrong days.
Google's all-day end date is exclusive; Leo's is inclusive. A one-day event on the 9th arrives as
start 03-09, end 03-10. Stored verbatim, every all-day event is a day too long and a single-day one renders across two. Month, year and leap-day boundaries are all checked.Three kinds of event are skipped, each for a non-obvious reason. A
cancelledevent is listed by Google, and the hub's sweep only removes what a pass did not list — so keeping it would leave a deleted event alive forever. An instance of a series (recurringEventId) arrives beside its master; this hub stores one master carrying an RRULE and expands on read, so importing instances writes duplicates on top of that expansion. And an event with no usable start/end cannot be placed at all.singleEvents=falsefor the same reason — one master with its rule, not hundreds of expanded rows the reader expands again.Absent optionals stay absent. The hub takes
Option<&str>;Some("")would overwrite a description the user had with an empty one.
Development
npm install
node test.js # no network neededThis server cannot be deployed
Maintenance
Related MCP Connectors
Hosted Google Calendar MCP server for AI agents. No self-hosting or Google Cloud setup.
A MCP server that works with Google Calendar to manage event listing, reading, and updates.
GDPR-compliant calendar access for AI assistants: read, create, edit, RSVP. Google, MS 365, Apple.
Google Events listings with dates, venues, and ticket links via a hosted MCP server.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceIntegrates Google Calendar with AI assistants via MCP, enabling calendar listing and event CRUD operations.-
- AlicenseNot gradedqualityDmaintenanceEnables interaction with Google Calendar through a unified MCP API for managing events, calendars, and related tools.MIT
- FlicenseDqualityDmaintenanceMCP server for interacting with Google Calendar, enabling reading events from public calendars and, with OAuth, creating, updating, and deleting events.1-
- FlicenseNot gradedqualityDmaintenanceEnables seamless Google Calendar integration with MCP-compatible clients, allowing creation, viewing, updating, and deletion of calendar events via OAuth 2.0 authentication.-