Back to Browse

Mewcp Google Calendar MCP Server

Developer ToolsUse Caution4.8MCP RegistryLocal
Free

Server data from the Official MCP Registry

Schedule smarter - create, search, and manage Google Calendar events through AI.

About

Schedule smarter - create, search, and manage Google Calendar events through AI.

Security Report

4.8
Use Caution4.8High Risk

This is a well-structured Google Calendar MCP server with proper authentication via OAuth and comprehensive error handling. The code demonstrates good security practices including proper credential handling through the fastmcp-credentials library, no hardcoded secrets, and appropriate input validation. Minor code quality issues and a few informational findings do not significantly impact the overall security posture. Supply chain analysis found 5 known vulnerabilities in dependencies (1 critical, 3 high severity).

4 files analyzed · 11 issues found

Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.

Permissions Required

This plugin requests these system permissions. Most are normal for its category.

HTTP Network Access

Connects to external APIs or services over the internet.

env_vars

Check that this permission is expected for this type of plugin.

How to Install

Add this to your MCP configuration file:

{
  "mcpServers": {
    "io-github-ammar-62-mewcp-google-calendar": {
      "args": [
        "-y",
        "github:AStheTECH/mewcp-google-calendar"
      ],
      "command": "npx"
    }
  }
}

Documentation

View on GitHub

From the project's GitHub README.

Schedule smarter — create, search, and manage Google Calendar events through AI.

A Model Context Protocol (MCP) server that exposes Google Calendar's API for creating, reading, updating, and deleting events and calendars.

Overview

The Google Calendar MCP Server provides full calendar management directly from AI workflows:

  • List, search, and retrieve events with rich filtering by time range, text, and recurrence
  • Create single, all-day, quick, and recurring events with attendees, reminders, and Meet links
  • Update events and manage attendees, then get before/after state in a single response
  • Query free/busy blocks across multiple calendars to find open slots without conflicts

Perfect for:

  • AI assistants that schedule, reschedule, and manage meetings on behalf of users
  • Workflow automation that reads calendar state to trigger time-based actions
  • Agents that coordinate availability and send invitations across teams

Tools

Events — Read

Lists events from a calendar within an optional time range. Returns events in start-time order. Recurring events are expanded into individual instances. Use ISO 8601 for time_min/time_max: 'YYYY-MM-DDTHH:MM:SSZ' (e.g. '2026-01-08T00:00:00Z'). Defaults to events from now onwards if time_min is not specified.

Inputs:

- `calendar_id` (string, optional, default: "primary") — Calendar ID. Use 'primary' for the user's main calendar
- `max_results` (int, optional, default: 10) — Maximum number of events to return (1–2500)
- `time_min` (string, optional, default: "") — Start of time range in ISO 8601 format, e.g. '2026-01-08T00:00:00Z'. Defaults to now
- `time_max` (string, optional, default: "") — End of time range in ISO 8601 format, e.g. '2026-01-15T23:59:59Z'. Omit for open-ended
- `query` (string, optional, default: "") — Free-text search query to filter events by title, description, or location
- `show_deleted` (bool, optional, default: false) — Include cancelled events in results
- `page_token` (string, optional, default: "") — Pagination token from a previous response's next_page_token to fetch the next page

Output data schema:

{
  count: number;
  events: {
    id: string;
    summary: string | null;
    start: { date: string | null; dateTime: string | null; timeZone: string | null; };
    end: { date: string | null; dateTime: string | null; timeZone: string | null; };
    status: string | null;
    htmlLink: string | null;
    created: string | null;
    updated: string | null;
    description: string | null;
    location: string | null;
    colorId: string | null;
    creator: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
    organizer: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
    recurrence: string[] | null;
    recurringEventId: string | null;
    originalStartTime: { date: string | null; dateTime: string | null; timeZone: string | null; } | null;
    transparency: string | null;
    visibility: string | null;
    iCalUID: string | null;
    sequence: number | null;
    attendees: {
      email: string;
      id: string | null;
      displayName: string | null;
      organizer: boolean | null;
      self: boolean | null;
      resource: boolean | null;
      optional: boolean | null;
      responseStatus: string | null;
      comment: string | null;
      additionalGuests: number | null;
    }[] | null;
    attendeesOmitted: boolean | null;
    guestsCanInviteOthers: boolean | null;
    guestsCanModify: boolean | null;
    guestsCanSeeOtherGuests: boolean | null;
    hangoutLink: string | null;
    conferenceData: object | null;
    reminders: { useDefault: boolean; overrides: { method: string; minutes: number; }[] | null; } | null;
    eventType: string | null;
  }[];
  next_page_token: string | null;
}

Gets full details of a specific event including attendees, RSVP statuses, recurrence rules, reminders, and conferencing info.

Inputs:

- `event_id` (string, required) — ID of the event to retrieve
- `calendar_id` (string, optional, default: "primary") — Calendar ID containing the event. Use 'primary' for the user's main calendar

Output data schema:

{
  id: string;
  summary: string | null;
  start: { date: string | null; dateTime: string | null; timeZone: string | null; };
  end: { date: string | null; dateTime: string | null; timeZone: string | null; };
  status: string | null;
  htmlLink: string | null;
  created: string | null;
  updated: string | null;
  description: string | null;
  location: string | null;
  colorId: string | null;
  creator: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
  organizer: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
  recurrence: string[] | null;
  recurringEventId: string | null;
  originalStartTime: { date: string | null; dateTime: string | null; timeZone: string | null; } | null;
  transparency: string | null;
  visibility: string | null;
  iCalUID: string | null;
  sequence: number | null;
  attendees: {
    email: string;
    id: string | null;
    displayName: string | null;
    organizer: boolean | null;
    self: boolean | null;
    resource: boolean | null;
    optional: boolean | null;
    responseStatus: string | null;
    comment: string | null;
    additionalGuests: number | null;
  }[] | null;
  attendeesOmitted: boolean | null;
  guestsCanInviteOthers: boolean | null;
  guestsCanModify: boolean | null;
  guestsCanSeeOtherGuests: boolean | null;
  hangoutLink: string | null;
  conferenceData: object | null;
  reminders: { useDefault: boolean; overrides: { method: string; minutes: number; }[] | null; } | null;
  eventType: string | null;
}

Searches for events by text across titles, descriptions, and locations. Optionally bound the search to a time range with time_min/time_max (ISO 8601, e.g. '2026-01-08T00:00:00Z'). Without a time range the search spans all history — always use a time range for large calendars.

Inputs:

- `query` (string, required) — Text to search for in event titles, descriptions, and locations
- `calendar_id` (string, optional, default: "primary") — Calendar ID to search in. Use 'primary' for the user's main calendar
- `max_results` (int, optional, default: 10) — Maximum number of events to return (1–2500)
- `time_min` (string, optional, default: "") — Optional start of time range in ISO 8601 format, e.g. '2026-01-01T00:00:00Z'
- `time_max` (string, optional, default: "") — Optional end of time range in ISO 8601 format, e.g. '2026-12-31T23:59:59Z'
- `page_token` (string, optional, default: "") — Pagination token from a previous response's next_page_token to fetch the next page

Output data schema:

{
  count: number;
  events: {
    id: string;
    summary: string | null;
    start: { date: string | null; dateTime: string | null; timeZone: string | null; };
    end: { date: string | null; dateTime: string | null; timeZone: string | null; };
    status: string | null;
    htmlLink: string | null;
    created: string | null;
    updated: string | null;
    description: string | null;
    location: string | null;
    colorId: string | null;
    creator: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
    organizer: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
    recurrence: string[] | null;
    recurringEventId: string | null;
    originalStartTime: { date: string | null; dateTime: string | null; timeZone: string | null; } | null;
    transparency: string | null;
    visibility: string | null;
    iCalUID: string | null;
    sequence: number | null;
    attendees: {
      email: string;
      id: string | null;
      displayName: string | null;
      organizer: boolean | null;
      self: boolean | null;
      resource: boolean | null;
      optional: boolean | null;
      responseStatus: string | null;
      comment: string | null;
      additionalGuests: number | null;
    }[] | null;
    attendeesOmitted: boolean | null;
    guestsCanInviteOthers: boolean | null;
    guestsCanModify: boolean | null;
    guestsCanSeeOtherGuests: boolean | null;
    hangoutLink: string | null;
    conferenceData: object | null;
    reminders: { useDefault: boolean; overrides: { method: string; minutes: number; }[] | null; } | null;
    eventType: string | null;
  }[];
  next_page_token: string | null;
}

Gets events starting from now through the next N days. Returns events in start-time order. Recurring events are expanded into individual instances.

Inputs:

- `days` (int, optional, default: 7) — Number of days to look ahead from now
- `calendar_id` (string, optional, default: "primary") — Calendar ID to query. Use 'primary' for the user's main calendar
- `max_results` (int, optional, default: 10) — Maximum number of events to return (1–2500)

Output data schema:

{
  count: number;
  events: {
    id: string;
    summary: string | null;
    start: { date: string | null; dateTime: string | null; timeZone: string | null; };
    end: { date: string | null; dateTime: string | null; timeZone: string | null; };
    status: string | null;
    htmlLink: string | null;
    created: string | null;
    updated: string | null;
    description: string | null;
    location: string | null;
    colorId: string | null;
    creator: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
    organizer: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
    recurrence: string[] | null;
    recurringEventId: string | null;
    originalStartTime: { date: string | null; dateTime: string | null; timeZone: string | null; } | null;
    transparency: string | null;
    visibility: string | null;
    iCalUID: string | null;
    sequence: number | null;
    attendees: {
      email: string;
      id: string | null;
      displayName: string | null;
      organizer: boolean | null;
      self: boolean | null;
      resource: boolean | null;
      optional: boolean | null;
      responseStatus: string | null;
      comment: string | null;
      additionalGuests: number | null;
    }[] | null;
    attendeesOmitted: boolean | null;
    guestsCanInviteOthers: boolean | null;
    guestsCanModify: boolean | null;
    guestsCanSeeOtherGuests: boolean | null;
    hangoutLink: string | null;
    conferenceData: object | null;
    reminders: { useDefault: boolean; overrides: { method: string; minutes: number; }[] | null; } | null;
    eventType: string | null;
  }[];
  next_page_token: string | null;
}

Gets all events scheduled for today in the given timezone. Pass the user's local timezone to get the correct day (e.g. 'America/New_York'). Defaults to UTC.

Inputs:

- `calendar_id` (string, optional, default: "primary") — Calendar ID to query. Use 'primary' for the user's main calendar
- `timezone` (string, optional, default: "UTC") — IANA timezone name to determine 'today', e.g. 'America/New_York'. Defaults to UTC

Output data schema:

{
  count: number;
  events: {
    id: string;
    summary: string | null;
    start: { date: string | null; dateTime: string | null; timeZone: string | null; };
    end: { date: string | null; dateTime: string | null; timeZone: string | null; };
    status: string | null;
    htmlLink: string | null;
    created: string | null;
    updated: string | null;
    description: string | null;
    location: string | null;
    colorId: string | null;
    creator: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
    organizer: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
    recurrence: string[] | null;
    recurringEventId: string | null;
    originalStartTime: { date: string | null; dateTime: string | null; timeZone: string | null; } | null;
    transparency: string | null;
    visibility: string | null;
    iCalUID: string | null;
    sequence: number | null;
    attendees: {
      email: string;
      id: string | null;
      displayName: string | null;
      organizer: boolean | null;
      self: boolean | null;
      resource: boolean | null;
      optional: boolean | null;
      responseStatus: string | null;
      comment: string | null;
      additionalGuests: number | null;
    }[] | null;
    attendeesOmitted: boolean | null;
    guestsCanInviteOthers: boolean | null;
    guestsCanModify: boolean | null;
    guestsCanSeeOtherGuests: boolean | null;
    hangoutLink: string | null;
    conferenceData: object | null;
    reminders: { useDefault: boolean; overrides: { method: string; minutes: number; }[] | null; } | null;
    eventType: string | null;
  }[];
  next_page_token: string | null;
}

Lists all individual instances of a recurring event by its master event ID. Use this to see every occurrence of a recurring series — use get_event or list_events to find the master event ID first. Instances include recurringEventId (the master ID) and originalStartTime (the scheduled time per RRULE, which differs from start if the instance was rescheduled). Optionally filter by time range to see only upcoming or past occurrences.

Inputs:

- `recurring_event_id` (string, required) — ID of the master recurring event whose instances to list
- `calendar_id` (string, optional, default: "primary") — Calendar ID containing the recurring event. Use 'primary' for the user's main calendar
- `max_results` (int, optional, default: 10) — Maximum number of instances to return (1–2500)
- `time_min` (string, optional, default: "") — Optional start of time range in ISO 8601 format, e.g. '2026-01-01T00:00:00Z'. Filters to instances starting at or after this time
- `time_max` (string, optional, default: "") — Optional end of time range in ISO 8601 format. Filters to instances starting before this time
- `show_deleted` (bool, optional, default: false) — Include cancelled instances in results
- `page_token` (string, optional, default: "") — Pagination token from a previous response's next_page_token to fetch the next page

Output data schema:

{
  count: number;
  events: {
    id: string;
    summary: string | null;
    start: { date: string | null; dateTime: string | null; timeZone: string | null; };
    end: { date: string | null; dateTime: string | null; timeZone: string | null; };
    status: string | null;
    htmlLink: string | null;
    created: string | null;
    updated: string | null;
    description: string | null;
    location: string | null;
    colorId: string | null;
    creator: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
    organizer: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
    recurrence: string[] | null;
    recurringEventId: string | null;
    originalStartTime: { date: string | null; dateTime: string | null; timeZone: string | null; } | null;
    transparency: string | null;
    visibility: string | null;
    iCalUID: string | null;
    sequence: number | null;
    attendees: {
      email: string;
      id: string | null;
      displayName: string | null;
      organizer: boolean | null;
      self: boolean | null;
      resource: boolean | null;
      optional: boolean | null;
      responseStatus: string | null;
      comment: string | null;
      additionalGuests: number | null;
    }[] | null;
    attendeesOmitted: boolean | null;
    guestsCanInviteOthers: boolean | null;
    guestsCanModify: boolean | null;
    guestsCanSeeOtherGuests: boolean | null;
    hangoutLink: string | null;
    conferenceData: object | null;
    reminders: { useDefault: boolean; overrides: { method: string; minutes: number; }[] | null; } | null;
    eventType: string | null;
  }[];
  next_page_token: string | null;
}

Events — Write

Creates a new calendar event and optionally invites attendees. For timed events use ISO 8601 datetime: '2026-01-08T14:30:00' with a timezone. For all-day events set is_all_day=True and use date-only format: '2026-01-08' — for all-day events end_time is exclusive, so a single-day event on Jan 8 needs end_time='2026-01-09'. Returns the created event with its ID.

Inputs:

- `summary` (string, required) — Event title
- `start_time` (string, required) — Start time: ISO 8601 datetime e.g. '2026-01-08T14:30:00', or date e.g. '2026-01-08' for all-day events
- `end_time` (string, required) — End time: ISO 8601 datetime or date. For all-day, end is exclusive: event on Jan 8 alone needs end_time='2026-01-09'
- `calendar_id` (string, optional, default: "primary") — Calendar ID to create the event in. Use 'primary' for the user's main calendar
- `description` (string, optional, default: "") — Event description or agenda
- `location` (string, optional, default: "") — Event location. Enables map directions and 'time to leave' alerts in Google Calendar
- `attendees` (list[string], optional, default: []) — Attendee email addresses. Invitation emails are sent per send_updates
- `timezone` (string, optional, default: "UTC") — IANA timezone for the event, e.g. 'America/New_York'. Ignored for all-day events
- `is_all_day` (bool, optional, default: false) — Set True for all-day events. Use date-only format (YYYY-MM-DD) for start_time and end_time
- `color_id` (string, optional, default: "") — Color ID 1–11 for the event. Empty uses the calendar's default color
- `visibility` (string, optional, default: "") — Event visibility: 'default', 'public', 'private', or 'confidential'. Empty uses calendar default
- `transparency` (string, optional, default: "") — Free/busy status: 'opaque' (user shows as busy, default) or 'transparent' (user shows as free/available during this event)
- `reminder_minutes` (int, optional, default: -1) — Minutes before event for a popup reminder (0–40320). Set -1 to use the calendar's default reminders
- `send_updates` (string, optional, default: "all") — Who receives invitation emails: 'all' (everyone), 'externalOnly' (non-Google users only), 'none' (no emails)
- `add_meet` (bool, optional, default: false) — Set True to automatically create a Google Meet video conference link for this event
- `optional_attendees` (list[string], optional, default: []) — Email addresses of optional attendees. These people are invited but their attendance is not required
- `guests_can_invite_others` (bool, optional, default: true) — Whether attendees can invite additional guests. Defaults to True per Google Calendar
- `guests_can_modify` (bool, optional, default: false) — Whether attendees can modify the event. Defaults to False

Output data schema:

{
  id: string;
  summary: string | null;
  start: { date: string | null; dateTime: string | null; timeZone: string | null; };
  end: { date: string | null; dateTime: string | null; timeZone: string | null; };
  status: string | null;
  htmlLink: string | null;
  created: string | null;
  updated: string | null;
  description: string | null;
  location: string | null;
  colorId: string | null;
  creator: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
  organizer: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
  recurrence: string[] | null;
  recurringEventId: string | null;
  originalStartTime: { date: string | null; dateTime: string | null; timeZone: string | null; } | null;
  transparency: string | null;
  visibility: string | null;
  iCalUID: string | null;
  sequence: number | null;
  attendees: {
    email: string;
    id: string | null;
    displayName: string | null;
    organizer: boolean | null;
    self: boolean | null;
    resource: boolean | null;
    optional: boolean | null;
    responseStatus: string | null;
    comment: string | null;
    additionalGuests: number | null;
  }[] | null;
  attendeesOmitted: boolean | null;
  guestsCanInviteOthers: boolean | null;
  guestsCanModify: boolean | null;
  guestsCanSeeOtherGuests: boolean | null;
  hangoutLink: string | null;
  conferenceData: object | null;
  reminders: { useDefault: boolean; overrides: { method: string; minutes: number; }[] | null; } | null;
  eventType: string | null;
}

Creates an event from a natural language text description. Google Calendar parses the text to extract title, date, time, and recurrence. Examples: 'Lunch with Sarah tomorrow at noon', 'Team standup every Monday at 9am'. Returns the created event. For complex events with attendees or custom fields, use create_event instead.

Inputs:

- `text` (string, required) — Natural language event description, e.g. 'Dentist appointment next Friday at 3pm'
- `calendar_id` (string, optional, default: "primary") — Calendar ID to create the event in. Use 'primary' for the user's main calendar
- `send_updates` (string, optional, default: "all") — Who receives invitation emails: 'all', 'externalOnly', or 'none'

Output data schema:

{
  id: string;
  summary: string | null;
  start: { date: string | null; dateTime: string | null; timeZone: string | null; };
  end: { date: string | null; dateTime: string | null; timeZone: string | null; };
  status: string | null;
  htmlLink: string | null;
  created: string | null;
  updated: string | null;
  description: string | null;
  location: string | null;
  colorId: string | null;
  creator: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
  organizer: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
  recurrence: string[] | null;
  recurringEventId: string | null;
  originalStartTime: { date: string | null; dateTime: string | null; timeZone: string | null; } | null;
  transparency: string | null;
  visibility: string | null;
  iCalUID: string | null;
  sequence: number | null;
  attendees: {
    email: string;
    id: string | null;
    displayName: string | null;
    organizer: boolean | null;
    self: boolean | null;
    resource: boolean | null;
    optional: boolean | null;
    responseStatus: string | null;
    comment: string | null;
    additionalGuests: number | null;
  }[] | null;
  attendeesOmitted: boolean | null;
  guestsCanInviteOthers: boolean | null;
  guestsCanModify: boolean | null;
  guestsCanSeeOtherGuests: boolean | null;
  hangoutLink: string | null;
  conferenceData: object | null;
  reminders: { useDefault: boolean; overrides: { method: string; minutes: number; }[] | null; } | null;
  eventType: string | null;
}

Creates a recurring calendar event using an RRULE recurrence pattern. recurrence_rule must start with 'RRULE:' followed by RFC 5545 parameters. Examples: 'RRULE:FREQ=DAILY;COUNT=5', 'RRULE:FREQ=WEEKLY;BYDAY=MO,WE,FR', 'RRULE:FREQ=MONTHLY;BYMONTHDAY=15', 'RRULE:FREQ=YEARLY'. Returns the master recurring event — individual instances are expanded by Google Calendar.

Inputs:

- `summary` (string, required) — Event title
- `start_time` (string, required) — Start time of the first occurrence in ISO 8601 format, e.g. '2026-01-08T14:30:00'
- `end_time` (string, required) — End time of the first occurrence in ISO 8601 format, e.g. '2026-01-08T15:30:00'
- `recurrence_rule` (string, required) — RRULE string starting with 'RRULE:', e.g. 'RRULE:FREQ=WEEKLY;BYDAY=MO'
- `calendar_id` (string, optional, default: "primary") — Calendar ID to create the event in. Use 'primary' for the user's main calendar
- `description` (string, optional, default: "") — Event description or agenda
- `location` (string, optional, default: "") — Event location
- `attendees` (list[string], optional, default: []) — Attendee email addresses. Invitation emails are sent per send_updates
- `timezone` (string, optional, default: "UTC") — IANA timezone for the event, e.g. 'America/New_York'
- `transparency` (string, optional, default: "") — Free/busy status: 'opaque' (shows as busy, default) or 'transparent' (shows as free)
- `reminder_minutes` (int, optional, default: -1) — Minutes before each occurrence for a popup reminder (0–40320). Set -1 to use calendar default
- `send_updates` (string, optional, default: "all") — Who receives invitation emails: 'all', 'externalOnly', or 'none'
- `add_meet` (bool, optional, default: false) — Set True to automatically create a Google Meet video conference link for this event
- `optional_attendees` (list[string], optional, default: []) — Email addresses of optional attendees. These people are invited but their attendance is not required
- `guests_can_invite_others` (bool, optional, default: true) — Whether attendees can invite additional guests. Defaults to True per Google Calendar
- `guests_can_modify` (bool, optional, default: false) — Whether attendees can modify the event. Defaults to False

Output data schema:

{
  id: string;
  summary: string | null;
  start: { date: string | null; dateTime: string | null; timeZone: string | null; };
  end: { date: string | null; dateTime: string | null; timeZone: string | null; };
  status: string | null;
  htmlLink: string | null;
  created: string | null;
  updated: string | null;
  description: string | null;
  location: string | null;
  colorId: string | null;
  creator: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
  organizer: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
  recurrence: string[] | null;
  recurringEventId: string | null;
  originalStartTime: { date: string | null; dateTime: string | null; timeZone: string | null; } | null;
  transparency: string | null;
  visibility: string | null;
  iCalUID: string | null;
  sequence: number | null;
  attendees: {
    email: string;
    id: string | null;
    displayName: string | null;
    organizer: boolean | null;
    self: boolean | null;
    resource: boolean | null;
    optional: boolean | null;
    responseStatus: string | null;
    comment: string | null;
    additionalGuests: number | null;
  }[] | null;
  attendeesOmitted: boolean | null;
  guestsCanInviteOthers: boolean | null;
  guestsCanModify: boolean | null;
  guestsCanSeeOtherGuests: boolean | null;
  hangoutLink: string | null;
  conferenceData: object | null;
  reminders: { useDefault: boolean; overrides: { method: string; minutes: number; }[] | null; } | null;
  eventType: string | null;
}

Updates an existing calendar event. Only the fields you provide are changed — leave a field empty to keep its current value. Fetches the current event first, applies changes, then saves. Use ISO 8601 for times: 'YYYY-MM-DDTHH:MM:SS'. For recurring events: pass the master recurring event ID to change all instances, or a specific instance ID to change only that occurrence. WARNING: do not update individual instances one-by-one to change the whole series — update the master event instead. Modifying instances individually creates exceptions that clutter the calendar and trigger excessive notifications. To cancel a single instance without affecting the rest of the series, set status='cancelled'.

Inputs:

- `event_id` (string, required) — ID of the event to update. For recurring events, use the master event ID to change all instances, or an instance ID to change only one occurrence
- `calendar_id` (string, optional, default: "primary") — Calendar ID containing the event
- `summary` (string, optional, default: "") — New event title. Leave empty to keep existing
- `start_time` (string, optional, default: "") — New start time in ISO 8601 format. Leave empty to keep existing
- `end_time` (string, optional, default: "") — New end time in ISO 8601 format. Leave empty to keep existing
- `description` (string, optional, default: "") — New event description. Leave empty to keep existing
- `location` (string, optional, default: "") — New event location. Leave empty to keep existing
- `timezone` (string, optional, default: "") — Timezone for the updated start/end times, e.g. 'America/New_York'. Leave empty to keep the event's existing timezone
- `status` (string, optional, default: "") — Event status: 'confirmed', 'tentative', or 'cancelled'. Set 'cancelled' on a recurring event instance ID to cancel only that occurrence without affecting the rest of the series
- `transparency` (string, optional, default: "") — Free/busy status: 'opaque' (shows as busy) or 'transparent' (shows as free). Leave empty to keep existing
- `reminder_minutes` (int, optional, default: -1) — Minutes before event for a popup reminder (0–40320). Set -1 to keep existing reminders
- `send_updates` (string, optional, default: "all") — Who receives update notifications: 'all', 'externalOnly', or 'none'
- `add_meet` (bool, optional, default: false) — Set True to add a Google Meet video conference link to this event. Has no effect if a Meet link already exists
- `guests_can_invite_others` (bool, optional) — Whether attendees can invite additional guests. Leave unset to keep existing value
- `guests_can_modify` (bool, optional) — Whether attendees can modify the event. Leave unset to keep existing value

Output data schema:

{
  before: {
    id: string;
    summary: string | null;
    start: { date: string | null; dateTime: string | null; timeZone: string | null; };
    end: { date: string | null; dateTime: string | null; timeZone: string | null; };
    status: string | null;
    htmlLink: string | null;
    created: string | null;
    updated: string | null;
    description: string | null;
    location: string | null;
    colorId: string | null;
    creator: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
    organizer: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
    recurrence: string[] | null;
    recurringEventId: string | null;
    originalStartTime: { date: string | null; dateTime: string | null; timeZone: string | null; } | null;
    transparency: string | null;
    visibility: string | null;
    iCalUID: string | null;
    sequence: number | null;
    attendees: {
      email: string;
      id: string | null;
      displayName: string | null;
      organizer: boolean | null;
      self: boolean | null;
      resource: boolean | null;
      optional: boolean | null;
      responseStatus: string | null;
      comment: string | null;
      additionalGuests: number | null;
    }[] | null;
    attendeesOmitted: boolean | null;
    guestsCanInviteOthers: boolean | null;
    guestsCanModify: boolean | null;
    guestsCanSeeOtherGuests: boolean | null;
    hangoutLink: string | null;
    conferenceData: object | null;
    reminders: { useDefault: boolean; overrides: { method: string; minutes: number; }[] | null; } | null;
    eventType: string | null;
  };
  after: {
    id: string;
    summary: string | null;
    start: { date: string | null; dateTime: string | null; timeZone: string | null; };
    end: { date: string | null; dateTime: string | null; timeZone: string | null; };
    status: string | null;
    htmlLink: string | null;
    created: string | null;
    updated: string | null;
    description: string | null;
    location: string | null;
    colorId: string | null;
    creator: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
    organizer: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
    recurrence: string[] | null;
    recurringEventId: string | null;
    originalStartTime: { date: string | null; dateTime: string | null; timeZone: string | null; } | null;
    transparency: string | null;
    visibility: string | null;
    iCalUID: string | null;
    sequence: number | null;
    attendees: {
      email: string;
      id: string | null;
      displayName: string | null;
      organizer: boolean | null;
      self: boolean | null;
      resource: boolean | null;
      optional: boolean | null;
      responseStatus: string | null;
      comment: string | null;
      additionalGuests: number | null;
    }[] | null;
    attendeesOmitted: boolean | null;
    guestsCanInviteOthers: boolean | null;
    guestsCanModify: boolean | null;
    guestsCanSeeOtherGuests: boolean | null;
    hangoutLink: string | null;
    conferenceData: object | null;
    reminders: { useDefault: boolean; overrides: { method: string; minutes: number; }[] | null; } | null;
    eventType: string | null;
  };
}

Adds new attendees to an existing event and sends them invitation emails. Skips emails that are already on the attendee list.

Inputs:

- `event_id` (string, required) — ID of the event to add attendees to
- `attendee_emails` (list[string], required) — Email addresses to add as required attendees
- `calendar_id` (string, optional, default: "primary") — Calendar ID containing the event
- `send_updates` (string, optional, default: "all") — Who receives invitation emails: 'all', 'externalOnly', or 'none'
- `optional_attendees` (list[string], optional, default: []) — Email addresses to add as optional attendees. These are invited but their attendance is not required

Output data schema:

{
  before: {
    id: string;
    summary: string | null;
    start: { date: string | null; dateTime: string | null; timeZone: string | null; };
    end: { date: string | null; dateTime: string | null; timeZone: string | null; };
    status: string | null;
    htmlLink: string | null;
    created: string | null;
    updated: string | null;
    description: string | null;
    location: string | null;
    colorId: string | null;
    creator: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
    organizer: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
    recurrence: string[] | null;
    recurringEventId: string | null;
    originalStartTime: { date: string | null; dateTime: string | null; timeZone: string | null; } | null;
    transparency: string | null;
    visibility: string | null;
    iCalUID: string | null;
    sequence: number | null;
    attendees: {
      email: string;
      id: string | null;
      displayName: string | null;
      organizer: boolean | null;
      self: boolean | null;
      resource: boolean | null;
      optional: boolean | null;
      responseStatus: string | null;
      comment: string | null;
      additionalGuests: number | null;
    }[] | null;
    attendeesOmitted: boolean | null;
    guestsCanInviteOthers: boolean | null;
    guestsCanModify: boolean | null;
    guestsCanSeeOtherGuests: boolean | null;
    hangoutLink: string | null;
    conferenceData: object | null;
    reminders: { useDefault: boolean; overrides: { method: string; minutes: number; }[] | null; } | null;
    eventType: string | null;
  };
  after: {
    id: string;
    summary: string | null;
    start: { date: string | null; dateTime: string | null; timeZone: string | null; };
    end: { date: string | null; dateTime: string | null; timeZone: string | null; };
    status: string | null;
    htmlLink: string | null;
    created: string | null;
    updated: string | null;
    description: string | null;
    location: string | null;
    colorId: string | null;
    creator: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
    organizer: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
    recurrence: string[] | null;
    recurringEventId: string | null;
    originalStartTime: { date: string | null; dateTime: string | null; timeZone: string | null; } | null;
    transparency: string | null;
    visibility: string | null;
    iCalUID: string | null;
    sequence: number | null;
    attendees: {
      email: string;
      id: string | null;
      displayName: string | null;
      organizer: boolean | null;
      self: boolean | null;
      resource: boolean | null;
      optional: boolean | null;
      responseStatus: string | null;
      comment: string | null;
      additionalGuests: number | null;
    }[] | null;
    attendeesOmitted: boolean | null;
    guestsCanInviteOthers: boolean | null;
    guestsCanModify: boolean | null;
    guestsCanSeeOtherGuests: boolean | null;
    hangoutLink: string | null;
    conferenceData: object | null;
    reminders: { useDefault: boolean; overrides: { method: string; minutes: number; }[] | null; } | null;
    eventType: string | null;
  };
}

Events — Delete

DESTRUCTIVE — REQUIRES EXPLICIT USER CONFIRMATION BEFORE CALLING. Permanently deletes a calendar event. This action is irreversible: the event, its attendees list, reminders, and all associated data are removed immediately and cannot be recovered. Attendees will receive cancellation emails (controlled by send_updates). For recurring events: deleting the master event ID removes the entire series and all its instances. Deleting a specific instance ID removes only that one occurrence. NEVER call this tool autonomously or as part of an automated flow. You MUST stop, tell the user the event title, date, and time that will be permanently deleted, and for recurring events clarify whether you are deleting one occurrence or the entire series, and wait for their explicit written confirmation before proceeding.

Inputs:

- `event_id` (string, required) — ID of the event to delete
- `calendar_id` (string, optional, default: "primary") — Calendar ID containing the event
- `send_updates` (string, optional, default: "all") — Who receives cancellation emails: 'all' (recommended), 'externalOnly', or 'none'

Output data schema:

{
  message: string;
}

Documentation truncated — see the full README on GitHub.

Reviews

No reviews yet

Be the first to review this server!