Google Calendar
Google Calendar stores calendars, events, and availability. This integration reads schedules and manages events on calendars the user enabled.
Available Tools
| Tool | Purpose | Approval |
|---|---|---|
calendar_list_calendars |
List enabled calendars with access roles and per-tool permissions | Auto |
calendar_list_events |
List events in a date range | Auto |
calendar_create_event |
Create a new event | Asks user |
calendar_update_event |
Update an existing event | Asks user |
calendar_delete_event |
Delete an event | Asks user |
calendar_check_availability |
Check free/busy status | Auto |
Date Format
All dates use ISO 8601 format: 2026-03-25T09:00:00
Use the user's timezone from their profile when constructing dates. Include the timezone
offset in all date strings you pass to calendar tools (e.g. 2026-03-25T09:00:00-04:00
for Eastern Daylight Time). If the user's timezone is unknown, ask before making any
calendar calls.
Event Naming Convention
For job-related events, use this format:
- Title:
Job: {Client Name} - {Brief Description} - Location: the job site address
- Description: scope of work, materials needed, or other notes
Example: Job: Test Customer - Kitchen Remodel at 123 Main Street
Finding an event
An event you have not listed this session is unknown, not absent. Never tell
the user an event does not exist, and never create a duplicate event, until
calendar_list_events has returned no match for the time range or search
criteria they gave. An event ID you already resolved this session can be
reused without re-listing.
Availability Checking
Always check availability before suggesting times or creating events:
- Use
calendar_check_availabilitywith the proposed date range - If busy slots exist, suggest alternative times
- Only create the event after confirming with the user
Deduplication
Before creating an event, check for existing events in the same time range:
- Use
calendar_list_eventsfor the target date range - Look for events with similar titles or times
- If a match exists, ask the user: "There's already an event at that time. Update it instead?"
Multi-calendar setups
When calendar_list_calendars returns more than one row, check the target calendar's access_role before mutating. Read-only roles (reader, freeBusyReader) reject create, update, and delete. Pass calendar_id explicitly on calendar_create_event, calendar_update_event, and calendar_delete_event rather than letting the tool default.
Common Workflows
Schedule a new job
calendar_check_availabilityfor the proposed date/time, defaulting to typical work hours if the user did not specify- If free, draft the event with sensible defaults for any missing fields (duration, location from context)
calendar_create_eventwith job title format, location, and description- Confirm what you assumed: "Scheduled Job: Test Customer - Kitchen Remodel for March 25, 9 AM to 5 PM at 123 Main Street. Change anything?"
Check the week's schedule
calendar_list_eventsfor the current week (Monday to Sunday)- Summarize events grouped by day
- Note any free blocks for potential scheduling
Reschedule a job
calendar_list_eventsto find the event and get its IDcalendar_check_availabilityfor the new proposed timecalendar_update_eventwith the event ID and new start/end- Confirm the change with the user
Cancel a job
calendar_list_eventsto find the event and get its ID- Confirm with the user before deleting
calendar_delete_eventwith the event ID
Find free time for a new job
calendar_check_availabilityfor the next few days- Identify free blocks long enough for the job
- Suggest available slots to the user
Tips
- Events created via these tools appear immediately in Google Calendar on all devices
- The event ID returned by
calendar_create_eventcan be used later for updates or deletes - For multi-day jobs, create separate events for each day rather than one spanning event
- When the user mentions a time without a date, assume the next occurrence of that time