Skip to main content
Glama

Create calendar event

create_event

Creates a new event in a writable iCloud calendar and returns the stored representation without altering existing events. Use list_calendars to obtain calendar_id and update_event for existing events.

Instructions

Create a new event in a writable iCloud calendar and return the stored representation; existing events are not changed. Use list_calendars first to obtain calendar_id, and use update_event when the event already exists. Timed values require matching offsets and timezones, all-day end dates are exclusive, recurrence rules omit the RRULE: prefix, and travel_minutes sets Apple Calendar travel time for timed events.

Input Schema

NameRequiredDescriptionDefault
endYesEvent end using the same temporal type and timezone as start; an all-day end date is exclusive.
rruleNoRFC 5545 recurrence rule without the RRULE: prefix; defaults to null.
startYesEvent start as a timed date-time or all-day date.
alarmsNoDisplay reminders; defaults to an empty array.
summaryYesEvent title, between 1 and 1,024 characters.
locationNoEvent location; defaults to null.
calendar_idYesOpaque destination calendar ID returned by list_calendars.
descriptionNoEvent notes; defaults to null.
travel_minutesNoApple Calendar travel time in whole minutes before the start; defaults to null. Only valid for timed events.

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 / travel_minutes
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 1440,
      +      "minimum": 1,
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Apple Calendar travel time in whole minutes before the start; defaults to null. Only valid for timed events."
      +}
    • 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. Changed37 schema fields changedv0.1.1
    • addedInput schema / properties / alarms / description
      Added value: +"Display reminders; defaults to an empty array."
    • addedInput schema / properties / alarms / items / description
      Added value: +"A display reminder attached to an event."
    • addedInput schema / properties / alarms / items / properties / action / description
      Added value: +"Alarm action; only DISPLAY is supported."
    • addedInput schema / properties / alarms / items / properties / description / description
      Added value: +"Optional notification text for this alarm."
    • addedInput schema / 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 / calendar_id / description
      Added value: +"Opaque destination calendar ID returned by list_calendars."
    • addedInput schema / properties / description / description
      Added value: +"Event notes; defaults to null."
    • changedInput 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": {
      -        "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 / end / description
      Added value: +"Event end using the same temporal type and timezone as start; an all-day end date is exclusive."
    • addedInput schema / properties / location / description
      Added value: +"Event location; defaults to null."
    • addedInput schema / properties / rrule / description
      Added value: +"RFC 5545 recurrence rule without the RRULE: prefix; defaults to null."
    • changedInput 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": {
      -        "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 / start / description
      Added value: +"Event start as a timed date-time or all-day date."
    • addedInput schema / properties / summary / description
      Added value: +"Event title, between 1 and 1,024 characters."
    • 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.5/5.0
Behavior4/5

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

Annotations already establish that this is a non-read-only, non-idempotent, open-world, non-destructive operation. The description adds useful behavioral context: it writes to a writable iCloud calendar, returns the stored representation, and explicitly states existing events are not changed. It omits permission and rate-limit details, but the annotation coverage lowers the burden.

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?

The description is front-loaded with purpose and usage, then consolidates key temporal and recurrence constraints without wasted text. Every clause carries actionable meaning for invocation.

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?

Given a nine-parameter create tool with full schema coverage, annotations, and an output schema, the description covers purpose, prerequisites, alternatives, and critical formatting semantics. Nothing essential for correct invocation is missing.

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

Parameters3/5

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

Schema description coverage is 100%, and the schema already documents matching timezone offsets, exclusive all-day end dates, the RRULE prefix omission, and travel_minutes being valid only for timed events. The description repeats and emphasizes these constraints but adds little genuinely new parameter-level meaning beyond the schema.

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: create a new event in a writable iCloud calendar. It also clarifies that it returns the stored representation and does not modify existing events, which distinguishes it from update_event and other sibling tools.

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

Usage Guidelines5/5

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

Explicitly directs the agent to call list_calendars first to obtain calendar_id, and names update_event as the alternative when the event already exists. This gives clear prerequisites and a concrete routing rule.

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