Calendar Create Event
When to Use
- User asks to "create an event" or "schedule a meeting"
- User asks to "add to calendar" or "set up a call"
- User wants to "book time" or "schedule something"
- User asks to make an event recurring
Tools
Discovery
- GOOGLECALENDAR_CUSTOM_LIST_CALENDARS — List all calendars
- GOOGLECALENDAR_FIND_FREE_SLOTS — Find available time slots
- GOOGLECALENDAR_FREE_BUSY_QUERY — Check busy/free status
- GOOGLECALENDAR_CUSTOM_FETCH_EVENTS — List events in time range
- GOOGLECALENDAR_CUSTOM_FIND_EVENT — Search events by keyword
Creation & Modification (Custom Tools vs Standard Tools)
Prefer using Custom Tools over standard Composio tools where possible, as they are simplified and sufficient for most use cases. However, standard tools (like GOOGLECALENDAR_CREATE_EVENT) are fully featured and can be used when advanced functionality is missing.
- GOOGLECALENDAR_CUSTOM_CREATE_EVENT — Create new event
confirm_immediately: False (default, sends to frontend for review)
- GOOGLECALENDAR_CREATE_EVENT — Standard composer tool. Use if the custom tool doesn't support an advanced parameter you explicitly need.
- GOOGLECALENDAR_CUSTOM_ADD_RECURRENCE — Add recurrence to existing event
- frequency: DAILY, WEEKLY, MONTHLY, YEARLY
- by_day: ["MO", "WE", "FR"] etc.
- count / until: Limit occurrences
- GOOGLECALENDAR_CUSTOM_PATCH_EVENT — Modify event
- GOOGLECALENDAR_CUSTOM_DELETE_EVENT — Delete (REQUIRES CONSENT)
Workflow
Step 1: Identify the Right Calendar
GOOGLECALENDAR_CUSTOM_LIST_CALENDARS()
- User may have multiple calendars (Work, Personal, Shared)
- If ambiguous, ask: "Which calendar? You have Work and Personal."
- Default to primary calendar if only one exists
Step 2: Gain Context & Check Availability (CRITICAL for meetings)
When scheduling with attendees or specific times, always understand the user's day first.
- Get the Day's Context:
GOOGLECALENDAR_CUSTOM_GET_DAY_SUMMARY(
date="2026-03-01"
)
- Or use
GOOGLECALENDAR_CUSTOM_FETCH_EVENTS for a wider range.
- Use this to understand what else the user has going on that day so you don't schedule a heavy meeting right after another heavy meeting or during their focus time.
- Find Free Slots (if needed):
GOOGLECALENDAR_FIND_FREE_SLOTS(
calendar_id="primary",
time_min="2026-03-01T09:00:00",
time_max="2026-03-01T17:00:00"
)
- Show available slots to user
- If attendee calendars are accessible, check their availability too
- Suggest the first available slot that works
- If all-day event, skip availability check
Step 3: Handle Timezone
All times in user's local timezone. The backend handles conversion.
- Use ISO format:
"2026-03-01T10:00:00"
- Do NOT include timezone offset in datetime strings
- Respect the user's stated time literally (if they say "3pm", use 15:00)
Step 4: Create the Event
GOOGLECALENDAR_CUSTOM_CREATE_EVENT(
calendar_id="primary",
title="Team Standup",
start_time="2026-03-01T09:00:00",
end_time="2026-03-01T09:30:00",
description="Daily sync",
attendees=["alice@company.com", "bob@company.com"],
create_meeting_room=True,
confirm_immediately=False
)
Confirmation workflow:
- Default:
confirm_immediately=False → Event sent to frontend for user review
- Only use
confirm_immediately=True when user explicitly says "just create it" or when confirming a previously drafted event
Always set create_meeting_room=True when:
- The event has attendees (i.e., it's a meeting)
- The event is described as "online", "virtual", or a "call"
- The user explicitly asks for a meeting link
This automatically generates a Google Meet link. It never hurts to add one for a meeting! Only omit if the user explicitly says they don't want a video call.
Step 5: Add Recurrence (2-step process)
Recurrence CANNOT be set during creation. Always create first, then add:
GOOGLECALENDAR_CUSTOM_ADD_RECURRENCE(
event_id="created_event_id",
calendar_id="primary",
frequency="WEEKLY",
by_day=["MO", "WE", "FR"],
count=10
)
Common patterns:
- Daily standup:
frequency="WEEKLY", by_day=["MO","TU","WE","TH","FR"]
- Weekly 1:1:
frequency="WEEKLY"
- Monthly review:
frequency="MONTHLY"
- Until date:
until="2026-06-30T00:00:00"
- N occurrences:
count=10
Step 6: Confirm to User
Report:
- Event title and time
- Calendar it was added to
- Attendees (if any)
- Recurrence pattern (if set)
- "Check your calendar to confirm the details."
Error Recovery
If creation fails:
- Calendar not found → LIST_CALENDARS → verify correct calendar_id → retry
- Time conflict → FIND_FREE_SLOTS → suggest alternative time → retry
- Permission error → Inform user, suggest checking calendar sharing settings
Important Rules
- Check availability first — Especially for meetings with attendees
- Local timezone always — Don't convert to UTC, backend handles it
- Confirm before finalizing — Use confirm_immediately=False by default
- Recurrence is 2-step — Create event first, then add recurrence
- Delete requires consent — Never delete events without asking
1---2name: calendar-create-event3description: Create calendar events intelligently - check availability, handle attendees, manage recurrence, timezone-aware scheduling with confirmation workflow.4---56# Calendar Create Event78## When to Use9- User asks to "create an event" or "schedule a meeting"10- User asks to "add to calendar" or "set up a call"11- User wants to "book time" or "schedule something"12- User asks to make an event recurring1314## Tools1516### Discovery17- **GOOGLECALENDAR_CUSTOM_LIST_CALENDARS** — List all calendars18- **GOOGLECALENDAR_FIND_FREE_SLOTS** — Find available time slots19- **GOOGLECALENDAR_FREE_BUSY_QUERY** — Check busy/free status20- **GOOGLECALENDAR_CUSTOM_FETCH_EVENTS** — List events in time range21- **GOOGLECALENDAR_CUSTOM_FIND_EVENT** — Search events by keyword2223### Creation & Modification (Custom Tools vs Standard Tools)24> **Prefer using Custom Tools** over standard Composio tools where possible, as they are simplified and sufficient for most use cases. However, standard tools (like `GOOGLECALENDAR_CREATE_EVENT`) are fully featured and can be used when advanced functionality is missing.2526- **GOOGLECALENDAR_CUSTOM_CREATE_EVENT** — Create new event27 - `confirm_immediately`: False (default, sends to frontend for review)28- **GOOGLECALENDAR_CREATE_EVENT** — Standard composer tool. Use if the custom tool doesn't support an advanced parameter you explicitly need.29- **GOOGLECALENDAR_CUSTOM_ADD_RECURRENCE** — Add recurrence to existing event30 - frequency: DAILY, WEEKLY, MONTHLY, YEARLY31 - by_day: ["MO", "WE", "FR"] etc.32 - count / until: Limit occurrences33- **GOOGLECALENDAR_CUSTOM_PATCH_EVENT** — Modify event34- **GOOGLECALENDAR_CUSTOM_DELETE_EVENT** — Delete (REQUIRES CONSENT)3536## Workflow3738### Step 1: Identify the Right Calendar3940```41GOOGLECALENDAR_CUSTOM_LIST_CALENDARS()42```4344- User may have multiple calendars (Work, Personal, Shared)45- If ambiguous, ask: "Which calendar? You have Work and Personal."46- Default to primary calendar if only one exists4748### Step 2: Gain Context & Check Availability (CRITICAL for meetings)4950When scheduling with attendees or specific times, **always understand the user's day first**.51521. **Get the Day's Context:**53```54GOOGLECALENDAR_CUSTOM_GET_DAY_SUMMARY(55 date="2026-03-01"56)57```58- Or use `GOOGLECALENDAR_CUSTOM_FETCH_EVENTS` for a wider range.59- Use this to understand what else the user has going on that day so you don't schedule a heavy meeting right after another heavy meeting or during their focus time.60612. **Find Free Slots (if needed):**62```63GOOGLECALENDAR_FIND_FREE_SLOTS(64 calendar_id="primary",65 time_min="2026-03-01T09:00:00",66 time_max="2026-03-01T17:00:00"67)68```6970- Show available slots to user71- If attendee calendars are accessible, check their availability too72- Suggest the first available slot that works73- If all-day event, skip availability check7475### Step 3: Handle Timezone7677**All times in user's local timezone.** The backend handles conversion.7879- Use ISO format: `"2026-03-01T10:00:00"`80- Do NOT include timezone offset in datetime strings81- Respect the user's stated time literally (if they say "3pm", use 15:00)8283### Step 4: Create the Event8485```86GOOGLECALENDAR_CUSTOM_CREATE_EVENT(87 calendar_id="primary",88 title="Team Standup",89 start_time="2026-03-01T09:00:00",90 end_time="2026-03-01T09:30:00",91 description="Daily sync",92 attendees=["alice@company.com", "bob@company.com"],93 create_meeting_room=True,94 confirm_immediately=False95)96```9798**Confirmation workflow:**99- Default: `confirm_immediately=False` → Event sent to frontend for user review100- Only use `confirm_immediately=True` when user explicitly says "just create it" or when confirming a previously drafted event101102> Always set `create_meeting_room=True` when:103> - The event has attendees (i.e., it's a meeting)104> - The event is described as "online", "virtual", or a "call"105> - The user explicitly asks for a meeting link106> This automatically generates a Google Meet link. It never hurts to add one for a meeting! Only omit if the user explicitly says they don't want a video call.107108### Step 5: Add Recurrence (2-step process)109110Recurrence CANNOT be set during creation. Always create first, then add:111112```113GOOGLECALENDAR_CUSTOM_ADD_RECURRENCE(114 event_id="created_event_id",115 calendar_id="primary",116 frequency="WEEKLY",117 by_day=["MO", "WE", "FR"],118 count=10119)120```121122**Common patterns:**123- Daily standup: `frequency="WEEKLY", by_day=["MO","TU","WE","TH","FR"]`124- Weekly 1:1: `frequency="WEEKLY"`125- Monthly review: `frequency="MONTHLY"`126- Until date: `until="2026-06-30T00:00:00"`127- N occurrences: `count=10`128129### Step 6: Confirm to User130131Report:132- Event title and time133- Calendar it was added to134- Attendees (if any)135- Recurrence pattern (if set)136- "Check your calendar to confirm the details."137138## Error Recovery139140If creation fails:1411. **Calendar not found** → LIST_CALENDARS → verify correct calendar_id → retry1422. **Time conflict** → FIND_FREE_SLOTS → suggest alternative time → retry1433. **Permission error** → Inform user, suggest checking calendar sharing settings144145## Important Rules1461. **Check availability first** — Especially for meetings with attendees1472. **Local timezone always** — Don't convert to UTC, backend handles it1483. **Confirm before finalizing** — Use confirm_immediately=False by default1494. **Recurrence is 2-step** — Create event first, then add recurrence1505. **Delete requires consent** — Never delete events without asking