Calendar MCP
Google Calendar for LLM agents: find, create, update, move, delete events; free/busy; scheduling.
Connector by deciduus · GitHub account verified by the MCP Registry
Install
Works with Claude Code, Codex, VS Code, Cursor, Windsurf, Claude Desktop. Read the repository before you give any tool access to your data.
npx agentmarket install connector/deciduus-calendar-mcp
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this server can do and what it asks for, from its tool list, install config and code. Checked Oct 25, 2026.
- Tools
- 12 read · 10 write · 1 delete
- Secrets
- 1 (API keys, tokens or passwords)
- Install scripts
- None found
- Runs as
- Python package
Tools by what they do 23
Read from the source code; the running server may list different tools.
Read 12 · Look things up without changing anything.
analyze_busynesscheck_attendee_statusdetect_conflictsfind_eventsfind_focus_timeget_preferenceslist_accountslist_calendarsproject_recurring_eventsquery_free_busysuggest_rescheduletime_audit
Write 10 · Create, change, send or run things.
add_attendeeblock_focus_timecreate_calendarcreate_eventmove_eventquick_add_eventrespond_to_eventschedule_mutualset_preferencesupdate_event
Delete 1 · Delete, drop, revoke or wipe things.
delete_event
Secrets and settings it asks for
Secrets: values you paste in that let it act as you.
GOOGLE_CLIENT_SECRET
Other settings (environment variables or headers).
GOOGLE_CLIENT_IDTOKEN_FILE_PATH
Network hosts it talks to 4
accounts.google.com· found in codegithub.com· found in codegoogleapis.com· found in codeoauth2.googleapis.com· found in code
Files it touches
%APPDATA%\\calendar-mcp- Your home directory (~)
~/.config/calendar-mcp- Any path the agent passes to its tools
Tools (23)
Read from the source code; the running server may differ. Descriptions are the server’s own words; hidden characters are shown as [U+…].
add_attendeeAdd attendeesInvite one or more people to an existing event. Existing attendees are kept; the new addresses are appended. Args: event_id: The event to invite people to (from `find_events`). attendee_emails: Email addresses to invite. calendar_id: Calendar the event lives on. send_notifications: Whether Google emails the attendees. Default true. account: Account name from 'calendar-mcp accounts'; omit for the default.
analyze_busynessAnalyze calendar loadSummarise how loaded each day is: event count and total scheduled minutes. Use this to answer "how busy is my week" without listing every event. Args: time_min: Start of the window, ISO 8601. time_max: End of the window, ISO 8601. calendar_id: Calendar to analyse. account: Account name from 'calendar-mcp accounts'; omit for the default.
block_focus_timeBook focus timeBook the best free blocks in a window as focus time, until the hours add up. Takes the blocks `find_focus_time` would report, longest first, and creates an event on each until `hours_needed` is covered. The last block is trimmed to what is still needed rather than swallowing a whole afternoon. Events are created busy, with reminders off and without notifying anyone. Run it with `dry_run` first when the user has not yet agreed to the times. Both preview and booking fail before writing if any checked calendar has unknown availability. The destination calendar is always checked too. Args: …
check_attendee_statusCheck attendee RSVPsReport who has accepted, declined or not yet answered an event invitation. Args: event_id: The event to inspect (from `find_events`). calendar_id: Calendar the event lives on. attendee_emails: Restrict the report to these addresses. Omit for all. account: Account name from 'calendar-mcp accounts'; omit for the default.
create_calendarCreate a calendarCreate a new secondary calendar owned by the user. Args: summary: Name for the new calendar, e.g. 'Client work'. account: Account name from 'calendar-mcp accounts'; omit for the default.
create_eventCreate an eventCreate an event with explicit start and end times, and optional attendees. For a one-line natural-language description ("coffee with Sam tomorrow at 3") prefer `quick_add_event`. Args: calendar_id: Calendar to create the event on. summary: Event title. Required. start_time: Start, ISO 8601 with a UTC offset (e.g. '2026-03-14T15:00:00-04:00'). Without an offset it is read in the calendar's own timezone. end_time: End, ISO 8601, same convention as start_time. description: Longer notes for the event body. location: Free-text location or meeting link. attendee…
delete_eventDelete an eventPermanently delete an event. This cannot be undone. Clients that support elicitation are asked to confirm first; if the user declines, nothing is deleted and `deleted` comes back false. Args: event_id: The event to delete (from `find_events`). calendar_id: Calendar the event lives on. send_notifications: Whether Google emails the attendees that it was cancelled. Default true. account: Account name from 'calendar-mcp accounts'; omit for the default.
detect_conflictsDetect calendar conflictsFind double-booked events in a window, across every signed-in account. Reports two things. `conflicts` are genuine overlaps -- the user cannot be in both places. `tight` transitions do not overlap but leave less than the buffer from `get_preferences`, which is what makes a day feel impossible. Events the user declined, events marked free, cancelled events and (unless `include_all_day` is set) all-day events are ignored, because none of them actually occupy the user. Args: time_min: Start of the window to check, ISO 8601. time_max: End of the window to check, ISO 8601. accounts: …
find_eventsFind eventsSearch a calendar for events, expanding recurring series into instances. Use this before any tool that needs an `event_id`. Narrow the window with `time_min`/`time_max` rather than raising `max_results`. Args: calendar_id: Calendar to search. 'primary' is the user's own calendar. time_min: Inclusive start of the window, ISO 8601 with a UTC offset. Without an offset it is read in the calendar's own timezone. time_max: Exclusive end of the window, ISO 8601. query: Free-text search over title, description, location and attendees. max_results: Maximum events to return…
find_focus_timeFind focus timeFind the uninterrupted blocks in a window that could be used for deep work. Searches inside the user's working hours (`get_preferences`), removes lunch, everything already booked on their calendars, and the buffer they like around meetings, then reports what is left -- longest block first, because that is the one worth protecting. Blocks shorter than `min_focus_block_minutes` are not reported at all. Availability must be readable for every requested calendar; otherwise this returns an error rather than unverified free time. Read-only: use `block_focus_time` to actually defend the time. Args…
get_preferencesGet scheduling preferencesRead the user's scheduling preferences: working hours, lunch, buffers, focus. Consult this before proposing meeting times or hunting for focus blocks, rather than assuming a nine-to-five. Never configured returns the defaults (Mon-Fri 09:00-17:00, no lunch break, no buffer), which is a reasonable guess but worth confirming with the user before you rely on it.
list_accountsList signed-in accountsList the Google accounts calendar-mcp can use, and which is the default. Every other tool takes an optional `account` argument naming one of these. An account whose `valid` is false needs `calendar-mcp auth --account <name>` run once in a terminal before its calendars can be read.
list_calendarsList calendarsList the calendars the signed-in user can see, with their IDs and timezones. Start here whenever the user mentions a calendar other than their own: the `id` values returned are what every other tool's `calendar_id` expects. Args: min_access_role: Only return calendars where the user has at least this role: 'freeBusyReader', 'reader', 'writer' or 'owner'. Omit for all. account: Account name from 'calendar-mcp accounts'; omit for the default.
move_eventMove or reschedule an eventReschedule an event, and/or move it to a different calendar. Supplying only `new_start` keeps the event's original duration -- this is the right tool for "push my 2pm back an hour". Supplying `destination_calendar_id` transfers the event between calendars. Args: event_id: The event to move (from `find_events`). calendar_id: Calendar the event currently lives on. new_start: New start, ISO 8601. Duration is preserved if new_end is omitted. new_end: New end, ISO 8601. Optional when new_start is given. destination_calendar_id: Calendar to transfer the event to. send_notif…
project_recurring_eventsProject recurring eventsCompute future occurrences of recurring events from their recurrence rules. Unlike `find_events`, this expands the RRULEs locally, so it reaches past the horizon Google materialises instances for -- useful for "when do my birthdays / standups land next year". Args: time_min: Start of the projection window, ISO 8601. time_max: End of the projection window, ISO 8601. calendar_id: Calendar whose recurring events should be projected. event_query: Only project recurring events matching this text, e.g. 'Birthday'. account: Account name from 'calendar-mcp accounts'; omit for the…
Show 8 more tools
query_free_busyQuery free/busyGet busy intervals for one or more calendars, without revealing event details. Works for other people's calendars addressed by email, which is how you check whether someone is free before proposing a time. Args: calendar_ids: Calendar IDs or attendee email addresses to check. time_min: Start of the window, ISO 8601 with a UTC offset. time_max: End of the window, ISO 8601 with a UTC offset. account: Account name from 'calendar-mcp accounts'; omit for the default.
quick_add_eventQuick-add an eventCreate an event from a plain-English phrase, parsed by Google. Google interprets the date, time and title itself, in the calendar's own timezone. Check the returned start/end and tell the user what was booked -- the parser guesses, and does not handle attendees or descriptions. Args: text: The phrase to parse, e.g. 'Dentist Thursday 9am' or 'Team sync every Monday at 10 for 30 minutes'. calendar_id: Calendar to create the event on. account: Account name from 'calendar-mcp accounts'; omit for the default.
respond_to_eventRSVP to an eventSet the user's own RSVP on an invitation they have received. Only works on events the user is an attendee of; it does not change anyone else's response. Args: event_id: The invitation to answer (from `find_events`). response_status: 'accepted', 'declined', 'tentative' or 'needsAction'. calendar_id: Calendar the invitation lives on. comment: Optional note sent to the organizer with the RSVP. send_notifications: Whether Google emails the organizer. Default true. account: Account name from 'calendar-mcp accounts'; omit for the default.
schedule_mutualFind a mutual slot and scheduleFind the first slot where everyone is free, then book the meeting there. Reads each attendee's free/busy inside the window, picks the earliest gap that fits `duration_minutes`, and creates the event with all of them invited. Refuses to book if any attendee or organizer availability is unknown. Fails with an error if no common slot exists -- widen the window or shorten the meeting and try again. By default the search obeys the user's own settings from `get_preferences`: their working hours per weekday (so nothing lands on a day off), their lunch break, and the buffer they want around meetings…
set_preferencesSet scheduling preferencesUpdate the user's scheduling preferences and save them. Returns the merged result. Only the arguments you pass change; everything else keeps its current value, so a single correction ("I actually start at 8") does not have to restate the whole schedule. The merged result is validated before it is written, so a rejected change leaves the saved preferences untouched. Args: timezone: IANA timezone the working hours are expressed in, e.g. 'Europe/Berlin'. Must be a real zone name. working_hours: Whole-schedule replacement, keyed by weekday ('mon'..'sun'), each value a lis…
suggest_rescheduleSuggest better times for an eventPropose better times for an existing meeting, ranked, keeping its length. Reads the event, then looks for slots of the same duration inside the user's working hours where the organiser is free, and ranks them: fewest attendee conflicts first, the event's current day next, then earliest. Slots that sit closer to another meeting than the user's buffer allows are penalised, not hidden. Read-only by default -- it suggests, the user decides. Set `apply` to move the event to the top suggestion once they have agreed to it. Args: event_id: The event to reschedule (from `find_events`). calen…
time_auditAudit where time wentReport where the user's time went: meeting hours, who with, and what focus time is left. Answers "how much of my week is meetings?", "who am I spending my time with?" and "where did my focus time go?" in one pass. Working hours, lunch, buffer and the minimum focus block come from the saved preferences (see get_preferences), so the percentages reflect this user's actual day. Declined meetings, events marked 'free', and all-day entries are excluded by default; the 'excluded' field says how many were skipped. Args: time_min: Start of the window to audit, ISO 8601. time_max: End of the …
update_eventUpdate an eventChange fields on an existing event. Omitted fields are left untouched. To reschedule while keeping the duration, use `move_event` instead: changing only `start_time` here leaves the old end time in place. Args: calendar_id: Calendar the event lives on. event_id: The event to update (from `find_events`). Required. summary: New title. start_time: New start, ISO 8601. end_time: New end, ISO 8601. description: New description. location: New location. send_notifications: Whether Google emails the attendees. Default true. account: Account name from 'calendar-mcp…
Signals
- Stars
- 26
- Forks
- 19
- Open issues
- 0
- Weekly downloads
- 60
- Last commit
- Sep 30, 2026 (29 days ago)
- Last release
- Sep 30, 2026 (29 days ago)
- Last package publish
- Sep 30, 2026 (29 days ago)
From GitHub (fetched Oct 24, 2026) and the package registry.
Details
- Registry name
io.github.deciduus/calendar-mcp- Version
- 1.0.1
- Auth
- API key
- Packages
- pypi calendar-mcp-server
- License
- License unknown
- Repository
- github.com/deciduus/calendar-mcp
- First seen
- Oct 24, 2026
- Last checked
- Oct 25, 2026
Cite this page
Calendar MCP. Agent Mart. https://agentmart.dev/connectors/deciduus-calendar-mcp (last updated 2026-10-25)