Google Calendar for LLM agents: find, create, update, move, delete events; free/busy; scheduling.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
We haven't yet run this listing's install command through our automated sandbox check. This isn't a red flag β we're steadily working through the catalog.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
An MCP server that gives an LLM client read and write access to your Google Calendar. It runs as a single process β stdio by default, streamable HTTP optionally β and exposes 23 tools with structured output: listing and searching calendars and events, creating, updating, moving, RSVPing to and deleting events, free/busy queries, busyness analysis, recurring-event projection, and finding a mutual slot and booking it. On top of that it has a scheduling brain that knows your working hours: finding and booking focus time, detecting double-bookings across several accounts at once, proposing better times for a meeting, and auditing where your week actually went. Authentication is Google OAuth 2.0 (Desktop app flow); tokens are cached locally, per account, and refreshed automatically.
1. Create Google OAuth credentials. In the Google Cloud console, enable the Google Calendar API, then create an OAuth client ID of type Desktop app. Copy the client ID and secret. (Details in Google Cloud setup.)
2. Set them in your environment, or in a .env file in the directory you run from (see example.env):
3. Sign in once, then add the server to your client:
This opens a browser and saves a token in the config directory (see Accounts); if you already have a .gcp-saved-tokens.json or set TOKEN_FILE_PATH, that file is used instead. Verify it with calendar-mcp check. Add more Google accounts with calendar-mcp auth --account work. After that the server runs non-interactively β it never opens a browser on its own unless you set CALENDAR_MCP_ALLOW_BROWSER_AUTH=1.
The PyPI distribution is
calendar-mcp-server. It installs two identical console scripts,calendar-mcpandcalendar-mcp-server, souvx calendar-mcp-serverand a localcalendar-mcpare the same command.
Claude Code
Claude Desktop β claude_desktop_config.json:
Cursor β .cursor/mcp.json (project) or ~/.cursor/mcp.json (global): same mcpServers block as above.
Any other client that speaks the standard mcpServers JSON takes the same entry. TOKEN_FILE_PATH is optional now that tokens default to the OS config directory, which does not depend on the working directory the client picks β but if you do set it, make it an absolute path.
The MCP endpoint is then http://127.0.0.1:8000/mcp (change the path with --path).
There is no authentication layer on the HTTP transport yet. Anyone who can reach the endpoint gets full access to the calendar the saved token belongs to. Bind it to loopback, or expose it only behind a trusted reverse proxy that authenticates, or on a private network such as a tailnet. Do not put it on a public interface.
Read-only tools never change anything. "Writes" tools create or modify events;
delete_event is the only one that destroys data.
Calendars and events
| Tool | Description | |
|---|---|---|
list_calendars | read | List the calendars the user can see, with IDs and timezones. |
find_events | read | Search a calendar for events, expanding recurring series into instances. |
check_attendee_status | read | Report who accepted, declined or has not answered an invitation. |
query_free_busy | read | Busy intervals for one or more calendars, without event details. |
analyze_busyness | read | Per-day event count and total scheduled minutes over a range. |
project_recurring_events | read | Compute future occurrences from recurrence rules. |
create_calendar | writes | Create a new secondary calendar. |
create_event | writes | Create an event with explicit start/end times and optional attendees. |
quick_add_event | writes | Create an event from a plain-English phrase, parsed by Google. |
update_event | writes | Change fields on an event; omitted fields are left untouched. |
move_event | writes | Reschedule an event, and/or move it to another calendar. |
add_attendee | writes | Invite one or more people to an existing event. |
respond_to_event | writes | Set your own RSVP (accepted/declined/tentative/needsAction). |
schedule_mutual | writes | Find the first slot where everyone is free, then book it. |
delete_event | destroys | Permanently delete an event. Asks the client to confirm via elicitation when supported. |
Scheduling brain β these read your saved preferences (working hours, lunch, buffer, minimum focus block).
| Tool | Description | |
|---|---|---|
find_focus_time | read | Uninterrupted blocks in a window that could be used for deep work, longest first. |
detect_conflicts | read | Double-bookings and too-tight transitions, across every signed-in account at once. |
time_audit | read | Where the time went: meeting hours, by size, domain, recurrence and person. |
suggest_reschedule | writes (opt-in) | Ranked better times for an existing meeting. Suggests only, unless apply: true. |
block_focus_time | writes | Book the best free blocks as focus time. dry_run: true to preview. |
Local configuration β no Google call, no account argument.
| Tool | Description | |
|---|---|---|
list_accounts | read | The accounts you have signed in, and which is the default. |
get_preferences | read | Working hours, lunch, buffer, minimum focus block, focus calendar. |
set_preferences | writes | Update and save those preferences. Local file only. |
Every calendar tool takes an optional trailing account argument (detect_conflicts
takes accounts, a list, because checking several at once is the point). All times
are ISO 8601 strings β a naive timestamp is interpreted in the target calendar's own
timezone.
The five scheduling tools share one idea: your calendar is not the same as your availability. They start from your working hours, subtract lunch, subtract what is already booked, and subtract the buffer you want around meetings β then reason about what is left.
Prompts that exercise them:
find_focus_time reports what exists; block_focus_time defends it by creating
events (busy, reminders off, nobody notified), trimming the last block so it books
exactly the hours you asked for rather than a whole afternoon. detect_conflicts
separates genuine overlaps from tight transitions that merely break your buffer,
and ignores events you declined, events marked free, and (by default) all-day
entries. suggest_reschedule keeps the meeting's duration, ranks candidate slots by
fewest attendee conflicts and prefers the event's current day, and moves nothing
unless you pass apply: true.
time_audit answers "how much of my week is meetings?" in one pass, grouped by
day or week:
Declined meetings, events marked free and all-day entries are left out by default;
include_declined and include_all_day bring them back.
delete_event is the only destructive tool. It asks the client to confirm
through MCP elicitation when the client supports it, and proceeds normally when
it does not.block_focus_time takes dry_run. Run it with dry_run: true to see the
exact blocks it would book before anything is written.suggest_reschedule does not move anything by default. apply is false
and has to be set explicitly, once the user has agreed to a time.update_event leaves fields you omit untouched.list_accounts, get_preferences and set_preferences never touch Google.
They read and write local files in the config directory.You can sign in more than one Google account and pick between them per call.
Every calendar tool takes an optional account argument naming one of these
("what's on my work calendar tomorrow?"). Omit it and the server uses the
default: CALENDAR_MCP_DEFAULT_ACCOUNT if set, otherwise the account named
default, otherwise the only account you have signed in. list_accounts
returns the same list the CLI prints, so the model can discover the names
itself.
Account names must match [A-Za-z0-9][A-Za-z0-9_-]{0,63}.
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/calendar-mcp-2)<a href="https://allmcps.com/mcp/calendar-mcp-2"><img src="https://allmcps.com/api/badge/calendar-mcp-2?style=directory" alt="Calendar MCP on AllMCPs" /></a>