Skip to main content
Glama

Manage Calendar Event

manage-event
Destructive

Update, decline, cancel, or delete existing Outlook calendar events. Preview changes with dryRun before sending emails or modifying your calendar.

Instructions

Manage an existing calendar event. dryRun: true previews any action without changing or sending anything: who would be emailed, with an external count (update also: who is added or removed, and the PATCH body). action=update edits fields via PATCH (subject, start, end, attendees, body, location, isOnlineMeeting, sensitivity, showAs, importance, categories, reminderMinutesBeforeStart); only fields you pass change. action=decline declines an invitation (optional comment; sendResponse: false declines without notifying the organiser). action=cancel cancels an event you organised and emails attendees. action=delete removes the event from your calendar (Graph documents no guaranteed recovery); deleting a meeting you organised that has attendees still emails them a cancellation, so use cancel with a comment to control that message. Returns the updated event on update; a confirmation otherwise. There is no accept action: accept invitations in the Outlook UI, as Graph's accept verb is unreliable.

Input Schema

NameRequiredDescriptionDefault
idNoAlias for `eventId` (canonical per the v3.7.3 alias pass).
endNoNew end time as ISO 8601 string or {dateTime, timeZone} object (action=update only)
bodyNoNew body content (action=update only)
startNoNew start time as ISO 8601 string or {dateTime, timeZone} object (action=update only)
actionYesAction to perform (required)
dryRunNoPreview only: nothing is changed or sent. Shows who would be emailed (decline/cancel/delete) or the PATCH body (update). Default false.
showAsNoFree/busy status shown to others (action=update only)
commentNoMessage sent with a decline or cancel (optional; omitted if not given)
eventIdNoThe ID of the event
subjectNoNew subject (action=update only)
locationNoNew location display name (action=update only)
attendeesNoFull replacement attendee list — pass the complete desired list, or [] to clear (action=update only). Each entry is an email address string or an {email, type} object (type 'required', 'optional' or 'resource'). A string, or an object without a type, keeps the type that address already has on the event (new addresses are required); an explicit type always wins. When OUTLOOK_ALLOWED_RECIPIENTS is set, every address on the list must be allowed or the update is refused.
categoriesNoFull replacement category list — pass [] to clear (action=update only)
importanceNoEvent importance flag (action=update only)
sensitivityNoEvent sensitivity classification (action=update only)
sendResponseNoSend the decline to the organiser (action=decline only; default true). Pass false to decline without notifying the organiser.
isOnlineMeetingNoToggle online meeting flag (action=update only)
reminderMinutesBeforeStartNoMinutes before start to fire the reminder (action=update only)

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed6 schema fields changedv3.14.1
    • changedInput schema / properties / attendees / description
      Previous value: -"Full replacement attendee list — pass complete desired list, or [] to clear (action=update only)"New value: +"Full replacement attendee list — pass the complete desired list, or [] to clear (action=update only). Each entry is an email address string or an {email, type} object (type 'required', 'optional' or 'resource'). A string, or an object without a type, keeps the type that address already has on the event (new addresses are required); an explicit type always wins. When OUTLOOK_ALLOWED_RECIPIENTS is set, every address on the list must be allowed or the update is refused."
    • addedInput schema / properties / attendees / items / oneOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "email": {
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "required",
      +          "optional",
      +          "resource"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "email"
      +    ],
      +    "type": "object"
      +  }
      +]
    • removedInput schema / properties / attendees / items / type
      Removed value: -"string"
    • changedInput schema / properties / comment / description
      Previous value: -"Optional comment for declining or cancelling the event"New value: +"Message sent with a decline or cancel (optional; omitted if not given)"
    • changedInput schema / properties / dryRun / description
      Previous value: -"Preview the PATCH without applying it (action=update only). Returns the body that would be sent to Graph."New value: +"Preview only: nothing is changed or sent. Shows who would be emailed (decline/cancel/delete) or the PATCH body (update). Default false."
    • addedInput schema / properties / sendResponse
      Added value: +{
      +  "description": "Send the decline to the organiser (action=decline only; default true). Pass false to decline without notifying the organiser.",
      +  "type": "boolean"
      +}
  2. Addedv3.9.1
  3. Removedv3.9.0
  4. Changed14 schema fields changedv3.8.0
    • changedInput schema / properties / action / enum
      Previous value: -[
      -  "decline",
      -  "cancel",
      -  "delete"
      -]New value: +[
      +  "update",
      +  "decline",
      +  "cancel",
      +  "delete"
      +]
    • addedInput schema / properties / attendees
      Added value: +{
      +  "description": "Full replacement attendee list — pass complete desired list, or [] to clear (action=update only)",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / body
      Added value: +{
      +  "description": "New body content (action=update only)",
      +  "type": "string"
      +}
    • addedInput schema / properties / categories
      Added value: +{
      +  "description": "Full replacement category list — pass [] to clear (action=update only)",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / dryRun
      Added value: +{
      +  "description": "Preview the PATCH without applying it (action=update only). Returns the body that would be sent to Graph.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / end
      Added value: +{
      +  "description": "New end time as ISO 8601 string or {dateTime, timeZone} object (action=update only)",
      +  "oneOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "dateTime": {
      +          "type": "string"
      +        },
      +        "timeZone": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "dateTime"
      +      ],
      +      "type": "object"
      +    }
      +  ]
      +}
    • addedInput schema / properties / importance
      Added value: +{
      +  "description": "Event importance flag (action=update only)",
      +  "enum": [
      +    "low",
      +    "normal",
      +    "high"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / isOnlineMeeting
      Added value: +{
      +  "description": "Toggle online meeting flag (action=update only)",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / location
      Added value: +{
      +  "description": "New location display name (action=update only)",
      +  "type": "string"
      +}
    • addedInput schema / properties / reminderMinutesBeforeStart
      Added value: +{
      +  "description": "Minutes before start to fire the reminder (action=update only)",
      +  "type": "number"
      +}
    • addedInput schema / properties / sensitivity
      Added value: +{
      +  "description": "Event sensitivity classification (action=update only)",
      +  "enum": [
      +    "normal",
      +    "personal",
      +    "private",
      +    "confidential"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / showAs
      Added value: +{
      +  "description": "Free/busy status shown to others (action=update only)",
      +  "enum": [
      +    "free",
      +    "tentative",
      +    "busy",
      +    "oof",
      +    "workingElsewhere",
      +    "unknown"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / start
      Added value: +{
      +  "description": "New start time as ISO 8601 string or {dateTime, timeZone} object (action=update only)",
      +  "oneOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "dateTime": {
      +          "type": "string"
      +        },
      +        "timeZone": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "dateTime"
      +      ],
      +      "type": "object"
      +    }
      +  ]
      +}
    • addedInput schema / properties / subject
      Added value: +{
      +  "description": "New subject (action=update only)",
      +  "type": "string"
      +}
  5. Changed3 schema fields changedv3.7.4
    • addedInput schema / additionalProperties
      Added value: +false
    • addedInput schema / properties / id
      Added value: +{
      +  "description": "Alias for `eventId` (canonical per the v3.7.3 alias pass).",
      +  "type": "string"
      +}
    • changedInput schema / required
      Previous value: -[
      -  "action",
      -  "eventId"
      -]New value: +[
      +  "action"
      +]
  6. First observedv3.4.1

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and non-idempotent, but the description adds substantially: dryRun previews emails and PATCH body, delete has no guaranteed recovery, deleting an organised meeting still emails attendees a cancellation, and sendResponse: false declines silently. This goes well 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.

Conciseness4/5

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

Well front-loaded with the dryRun behaviour first, then actions in order, ending with the no-accept note. Some density from the long parenthetical field lists, but every sentence adds actionable information and nothing is redundant.

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 destructive, non-idempotent mutation tool with no output schema, the description covers the behavioural risks (irreversibility, unintended emails), the preview mechanism, action semantics, and the accept workaround. An agent has enough to invoke correctly and avoid surprises.

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 schema documents each parameter including the complex attendees replacement semantics. The description adds meaning beyond the schema by grouping parameters by action, noting 'only fields you pass change', and clarifying cancel/delete email behaviour tied to comment. Small gap: reminderMinutesBeforeStart, isOnlineMeeting, and the full field list aren't individually explained in prose, but the action-fields mapping is valuable.

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?

The description specifies a clear verb and resource and distinguishes the four actions: update (edits fields via PATCH), decline (declines invitation), cancel (cancels an event you organised and emails attendees), and delete (removes the event). It also names sibling create-event by positioning itself as operating on an existing event.

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?

Explicit guidance on when to use cancel versus delete ('use cancel with a comment to control that message'), that accept is unavailable and should be done in the Outlook UI, and the role of dryRun as a preview. This is the strongest kind of when-to-use/when-not-to guidance.

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