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
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.
Your Gmail, Calendar, Drive, GitHub, Oura, wallet and confirmed profile facts in any MCP client.
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
- AlicenseDqualityDmaintenanceMCP server for interacting with Google Calendar, enabling reading events from public calendars and, with OAuth, creating, updating, and deleting events.1ISC
- AlicenseNot gradedqualityDmaintenanceEnables seamless Google Calendar integration with MCP-compatible clients, allowing creation, viewing, updating, and deletion of calendar events via OAuth 2.0 authentication.MIT