Skip to main content
Glama

Update calendar event

update_event
Destructive

Modify an existing calendar event or recurring series by resource ID or calendar ID plus UID; patch fields selectively, clear nullable values, remove alarms, and guard writes with an ETag.

Instructions

Modify an existing event or entire recurring series; individual expanded occurrences are not supported. Target it by resource_id or by calendar_id with uid. Omitted patch fields are preserved, null clears nullable fields, an empty alarms array removes alarms, and expected_etag can prevent a stale write.

Input Schema

NameRequiredDescriptionDefault
uidNoiCalendar UID of the event. Provide it together with calendar_id when resource_id is unavailable.
patchYesFields to replace. Omitted fields are preserved; null clears nullable values and an empty alarms array removes all alarms.
calendar_idNoOpaque calendar ID returned by list_calendars. Provide it together with uid when resource_id is unavailable.
resource_idNoOpaque event resource ID returned by list_events or get_event. Provide it alone instead of calendar_id and uid.
expected_etagNoETag previously returned for the event. When supplied, the update fails if the event changed since it was read.

Output Schema

NameRequiredDescriptionDefault
endYesNormalized event end.
uidYesStored iCalendar UID.
etagYesCurrent ETag for optimistic concurrency, when available.
hrefYesRedacted fingerprint of the CalDAV resource URL.
rruleYesStored RFC 5545 recurrence rule without the RRULE: prefix.
startYesNormalized event start.
alarmsYesNormalized alarms attached to the event.
summaryYesStored event title.
locationYesStored event location.
raw_icalNoRaw iCalendar resource, included only when explicitly requested.
recurringYesWhether this event belongs to a recurring series.
calendar_idYesOpaque ID of the containing calendar.
descriptionYesStored event notes.
resource_idYesOpaque event ID accepted by get_event, update_event, and delete_event.
recurrence_idYesOccurrence identifier for an expanded recurring event.
travel_minutesYesApple Calendar travel time in whole minutes before the start, or null when none is set.
recurrence_exceptionYesWhether this result is an overridden recurrence instance.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changedv0.2.0
    • addedInput schema / properties / patch / properties / travel_minutes
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 1440,
      +      "minimum": 1,
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Replacement Apple Calendar travel time in whole minutes; omit to preserve it or use null to remove travel time and related routing metadata. A number requires a timed event; converting to all-day requires clearing existing travel time with null."
      +}
    • addedOutput schema / properties / travel_minutes
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Apple Calendar travel time in whole minutes before the start, or null when none is set."
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "calendar_id",
      -  "resource_id",
      -  "uid",
      -  "href",
      -  "etag",
      -  "summary",
      -  "start",
      -  "end",
      -  "description",
      -  "location",
      -  "rrule",
      -  "alarms",
      -  "recurring",
      -  "recurrence_exception",
      -  "recurrence_id"
      -]New value: +[
      +  "calendar_id",
      +  "resource_id",
      +  "uid",
      +  "href",
      +  "etag",
      +  "summary",
      +  "start",
      +  "end",
      +  "description",
      +  "location",
      +  "rrule",
      +  "alarms",
      +  "travel_minutes",
      +  "recurring",
      +  "recurrence_exception",
      +  "recurrence_id"
      +]
  2. Changed14 schema fields changedv0.1.7
    • removedOutput schema / properties / alarms / items / properties / description / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / alarms / items / properties / description / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / alarms / items / properties / uid / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / alarms / items / properties / uid / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / description / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / description / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / etag / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / etag / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / location / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / location / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / recurrence_id / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / recurrence_id / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / rrule / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / rrule / type
      Added value: +[
      +  "string",
      +  "null"
      +]
  3. Changed41 schema fields changedv0.1.1
    • addedInput schema / properties / calendar_id / description
      Added value: +"Opaque calendar ID returned by list_calendars. Provide it together with uid when resource_id is unavailable."
    • addedInput schema / properties / expected_etag / description
      Added value: +"ETag previously returned for the event. When supplied, the update fails if the event changed since it was read."
    • addedInput schema / properties / patch / description
      Added value: +"Fields to replace. Omitted fields are preserved; null clears nullable values and an empty alarms array removes all alarms."
    • addedInput schema / properties / patch / properties / alarms / description
      Added value: +"Replacement alarm set; use an empty array to remove all alarms."
    • addedInput schema / properties / patch / properties / alarms / items / description
      Added value: +"A display reminder attached to an event."
    • addedInput schema / properties / patch / properties / alarms / items / properties / action / description
      Added value: +"Alarm action; only DISPLAY is supported."
    • addedInput schema / properties / patch / properties / alarms / items / properties / description / description
      Added value: +"Optional notification text for this alarm."
    • addedInput schema / properties / patch / properties / alarms / items / properties / minutes_before / description
      Added value: +"Whole minutes before the event start; use 0 for an alarm at start time."
    • addedInput schema / properties / patch / properties / description / description
      Added value: +"Replacement notes; use null to clear the description."
    • changedInput schema / properties / patch / properties / end / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "date_time": {
      -        "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:Z|[+-]\\d{2}:\\d{2})$",
      -        "type": "string"
      -      },
      -      "timezone": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "date_time",
      -      "timezone"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "date": {
      -        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "date"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "description": "A timed calendar value with an explicit offset and IANA timezone.",
      +    "properties": {
      +      "date_time": {
      +        "description": "ISO 8601 date-time with seconds and an explicit UTC offset or Z.",
      +        "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:Z|[+-]\\d{2}:\\d{2})$",
      +        "type": "string"
      +      },
      +      "timezone": {
      +        "description": "IANA timezone for the local event time; its offset must match date_time.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "date_time",
      +      "timezone"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "An all-day calendar value.",
      +    "properties": {
      +      "date": {
      +        "description": "Calendar date in YYYY-MM-DD format.",
      +        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "date"
      +    ],
      +    "type": "object"
      +  }
      +]
    • addedInput schema / properties / patch / properties / end / description
      Added value: +"Replacement end; provide together with start. An all-day end date is exclusive."
    • addedInput schema / properties / patch / properties / location / description
      Added value: +"Replacement location; use null to clear it."
    • addedInput schema / properties / patch / properties / rrule / description
      Added value: +"Replacement RFC 5545 recurrence rule without RRULE:, or null to make the event non-recurring."
    • changedInput schema / properties / patch / properties / start / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "date_time": {
      -        "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:Z|[+-]\\d{2}:\\d{2})$",
      -        "type": "string"
      -      },
      -      "timezone": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "date_time",
      -      "timezone"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "date": {
      -        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "date"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "description": "A timed calendar value with an explicit offset and IANA timezone.",
      +    "properties": {
      +      "date_time": {
      +        "description": "ISO 8601 date-time with seconds and an explicit UTC offset or Z.",
      +        "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:Z|[+-]\\d{2}:\\d{2})$",
      +        "type": "string"
      +      },
      +      "timezone": {
      +        "description": "IANA timezone for the local event time; its offset must match date_time.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "date_time",
      +      "timezone"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "An all-day calendar value.",
      +    "properties": {
      +      "date": {
      +        "description": "Calendar date in YYYY-MM-DD format.",
      +        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "date"
      +    ],
      +    "type": "object"
      +  }
      +]
    • addedInput schema / properties / patch / properties / start / description
      Added value: +"Replacement start; provide together with end."
    • addedInput schema / properties / patch / properties / summary / description
      Added value: +"Replacement event title."
    • addedInput schema / properties / resource_id / description
      Added value: +"Opaque event resource ID returned by list_events or get_event. Provide it alone instead of calendar_id and uid."
    • addedInput schema / properties / uid / description
      Added value: +"iCalendar UID of the event. Provide it together with calendar_id when resource_id is unavailable."
    • addedOutput schema / properties / alarms / description
      Added value: +"Normalized alarms attached to the event."
    • addedOutput schema / properties / alarms / items / description
      Added value: +"A normalized alarm returned by iCloud Calendar."
    • addedOutput schema / properties / alarms / items / properties / action / description
      Added value: +"Stored iCalendar alarm action."
    • addedOutput schema / properties / alarms / items / properties / description / description
      Added value: +"Stored alarm notification text, when available."
    • addedOutput schema / properties / alarms / items / properties / minutes_before / description
      Added value: +"Whole minutes before event start, when representable."
    • addedOutput schema / properties / alarms / items / properties / uid / description
      Added value: +"Stored alarm UID, when available."
    • addedOutput schema / properties / calendar_id / description
      Added value: +"Opaque ID of the containing calendar."
    • addedOutput schema / properties / description / description
      Added value: +"Stored event notes."
    • changedOutput schema / properties / end / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "date_time": {
      -        "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:Z|[+-]\\d{2}:\\d{2})$",
      -        "type": "string"
      -      },
      -      "timezone": {
      -        "maxLength": 4096,
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "date_time",
      -      "timezone"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "date": {
      -        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "date"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "description": "A stored timed calendar value.",
      +    "properties": {
      +      "date_time": {
      +        "description": "Stored ISO 8601 date-time with seconds and an explicit UTC offset or Z.",
      +        "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:Z|[+-]\\d{2}:\\d{2})$",
      +        "type": "string"
      +      },
      +      "timezone": {
      +        "description": "IANA timezone associated with the stored date-time.",
      +        "maxLength": 4096,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "date_time",
      +      "timezone"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "An all-day calendar value.",
      +    "properties": {
      +      "date": {
      +        "description": "Calendar date in YYYY-MM-DD format.",
      +        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "date"
      +    ],
      +    "type": "object"
      +  }
      +]
    • addedOutput schema / properties / end / description
      Added value: +"Normalized event end."
    • addedOutput schema / properties / etag / description
      Added value: +"Current ETag for optimistic concurrency, when available."
    • addedOutput schema / properties / href / description
      Added value: +"Redacted fingerprint of the CalDAV resource URL."
    • addedOutput schema / properties / location / description
      Added value: +"Stored event location."
    • addedOutput schema / properties / raw_ical / description
      Added value: +"Raw iCalendar resource, included only when explicitly requested."
    • addedOutput schema / properties / recurrence_exception / description
      Added value: +"Whether this result is an overridden recurrence instance."
    • addedOutput schema / properties / recurrence_id / description
      Added value: +"Occurrence identifier for an expanded recurring event."
    • addedOutput schema / properties / recurring / description
      Added value: +"Whether this event belongs to a recurring series."
    • addedOutput schema / properties / resource_id / description
      Added value: +"Opaque event ID accepted by get_event, update_event, and delete_event."
    • addedOutput schema / properties / rrule / description
      Added value: +"Stored RFC 5545 recurrence rule without the RRULE: prefix."
    • changedOutput schema / properties / start / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "date_time": {
      -        "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:Z|[+-]\\d{2}:\\d{2})$",
      -        "type": "string"
      -      },
      -      "timezone": {
      -        "maxLength": 4096,
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "date_time",
      -      "timezone"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "date": {
      -        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "date"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "description": "A stored timed calendar value.",
      +    "properties": {
      +      "date_time": {
      +        "description": "Stored ISO 8601 date-time with seconds and an explicit UTC offset or Z.",
      +        "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:Z|[+-]\\d{2}:\\d{2})$",
      +        "type": "string"
      +      },
      +      "timezone": {
      +        "description": "IANA timezone associated with the stored date-time.",
      +        "maxLength": 4096,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "date_time",
      +      "timezone"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "An all-day calendar value.",
      +    "properties": {
      +      "date": {
      +        "description": "Calendar date in YYYY-MM-DD format.",
      +        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "date"
      +    ],
      +    "type": "object"
      +  }
      +]
    • addedOutput schema / properties / start / description
      Added value: +"Normalized event start."
    • addedOutput schema / properties / summary / description
      Added value: +"Stored event title."
    • addedOutput schema / properties / uid / description
      Added value: +"Stored iCalendar UID."
  4. First observedv0.1.0

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=false, so the mutation risk profile is covered. The description usefully adds patch semantics (omitted fields preserved, null clears, empty alarms removes) and the etag-based concurrency guard, which are genuine behavioral facts beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences, front-loaded with purpose and scope, then the targeting and patch rules. No filler and nothing repeated for its own sake.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 5-parameter nested mutation tool, the description covers targeting, patch replace-vs-clear semantics, recurrence limits, and concurrency control, while annotations carry the safety profile and an output schema exists. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter meaning: resource_id stands alone while calendar_id must be paired with uid, and it restates the preserve/clear contract for the patch object. That is modest but real value beyond the per-field schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Modify an existing event or entire recurring series') and immediately bounds scope with a negative ('individual expanded occurrences are not supported'). That scope statement cleanly separates it from create_event, delete_event, and get_event without needing to name them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete invocation guidance: target by resource_id or by calendar_id with uid, and use expected_etag for stale-write protection. It also states an explicit exclusion (no per-occurrence edits), but never names a sibling alternative for cases like deleting or creating, so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.