Koskamo

Smart Calendars AI MCP

This MCP server enables AI agents to create, read, and update shared calendar feeds (ICS) from a Smart Calendars AI account. It allows users to convert various inputs like PDFs, spreadsheets, images, or pasted schedules into subscribable calendar events, which can then be managed and shared with colleagues or family via standard calendar apps like Apple Calendar, Google Calendar, or Outlook.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Smart Calendars AI MCP logo, by Smart Calendars AIVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by Smart Calendars AI
You need:Use your Smart Calendars AI account, or create one.Check the calendar permissions before you approve.Use an up-to-date client.
MCP endpoint (Streamable HTTP)
https://api.smartcalendars.ai/mcp
Vendor documentation

What you can do with it

  • Turn a PDF, spreadsheet, image or pasted schedule into a calendar
  • Create new web feeds or read and manage existing feeds in your Smart Calendars AI account
  • Subscribe to feeds in Apple Calendar, Google Calendar or Outlook
  • Move one event and see the others stay exactly as they were

Source and maintenance

Vendor evidenceRegistry 2.0.0

Protocol and capabilities

Server
smart-calendars-feeds 2.0.0
MCP protocol
2025-06-18
Tools
7 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  }
}

Tools

7 advertised

create_feed — Create a subscription calendar
Advertised by the server during the last successful anonymous check.
Open-world

Creates a subscription calendar from user-reviewed structured events and optionally activates it. Intended for an explicit request to save a schedule. The caller supplies the events; source-document extraction and automatic monitoring are not performed. Existing account feed and creation allowances apply. Identical retries retain the original request_id and payload. publication.status reports calendar-file preparation, not subscription access. distribution_ready reports subscription availability at the returned revision; availability may change afterward. Scope is limited to the connected account’s Smart Calendars AI feeds. No mailbox access, source-document retrieval, automatic source monitoring, scheduled PDF checks or document refresh is provided. Structured schedule content is supplied explicitly by the caller. Result links: subscription_open_url is the exact HTTPS handoff to the default calendar app via webcal; subscription_options_url provides Apple/default, Google, Outlook and copy-link choices; subscription_url is the copyable HTTPS calendar-file fallback; manage_url opens the feed dashboard. URL hosts, paths and tokens identify the returned resource and are not interchangeable. A filtered_subscription has its own links for that selection; top-level links remain unfiltered. Subscription access requires distribution_ready=true. Opening a link does not confirm a subscription; confirmation occurs in the user’s calendar app.

create_feed input schema
{
  "type": "object",
  "required": [
    "request_id",
    "title",
    "events"
  ],
  "properties": {
    "title": {
      "type": "string",
      "maxLength": 20000,
      "description": "Calendar title for the reviewed schedule."
    },
    "events": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "event"
        ],
        "properties": {
          "event": {
            "type": "object",
            "required": [
              "title",
              "start_date",
              "is_all_day"
            ],
            "properties": {
              "title": {
                "type": [
                  "string",
                  "null"
                ],
                "maxLength": 20000,
                "description": "Event title from the supplied schedule."
              },
              "assignee": {
                "type": [
                  "string",
                  "null"
                ],
                "maxLength": 20000,
                "description": "Optional event assignee explicitly named in the schedule; not the connected account identity, email address or a user profile."
              },
              "end_date": {
                "type": [
                  "string",
                  "null"
                ],
                "maxLength": 20000,
                "description": "Inclusive last calendar date, YYYY-MM-DD. A bounded multi-day range represents one event unless the user requests separate events."
              },
              "end_time": {
                "type": [
                  "string",
                  "null"
                ],
                "maxLength": 20000,
                "description": "Local event end time in HH:mm format, on end_date when supplied or start_date otherwise. All-day events have no clock time."
              },
              "location": {
                "type": [
                  "string",
                  "null"
                ],
                "maxLength": 20000,
                "description": "The event venue explicitly supplied in the schedule or requested correction, not the user’s current, home or device location. User geolocation is outside this field’s scope."
              },
              "timezone": {
                "type": [
                  "string",
                  "null"
                ],
                "maxLength": 20000,
                "description": "IANA timezone for the event local dates and times, for example Europe/Berlin or UTC."
              },
              "is_all_day": {
                "type": "boolean",
                "description": "True for an all-day calendar event with dates and no clock times; false for a timed event with a local start time and optional end time."
              },
              "recurrence": {
                "type": [
                  "object",
                  "null"
                ],
                "required": [
                  "frequency",
                  "interval",
                  "selectedWeekdays",
                  "monthlyType",
                  "selectedDaysOfMonth",
                  "weekdayOrdinal",
                  "weekdayCategory",
                  "selectedMonths",
                  "endDate",
                  "occurrenceCount"
                ],
                "properties": {
                  "endDate": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "End date for recurrence in YYYY-MM-DD format, or null if no end date"
                  },
                  "interval": {
                    "type": "integer",
                    "maximum": 999,
                    "minimum": 1,
                    "description": "Interval between recurrences (e.g., 2 for every 2 weeks)"
                  },
                  "frequency": {
                    "enum": [
                      "daily",
                      "weekly",
                      "monthly",
                      "yearly"
                    ],
                    "type": "string",
                    "description": "Base recurrence frequency"
                  },
                  "monthlyType": {
                    "enum": [
                      "dayOfMonth",
                      "dayOfWeek"
                    ],
                    "type": "string",
                    "description": "Type of monthly recurrence: by date or by weekday pattern"
                  },
                  "selectedMonths": {
                    "type": "array",
                    "items": {
                      "type": "integer",
                      "maximum": 12,
                      "minimum": 1
                    },
                    "description": "Selected months for yearly recurrence (1-12)"
                  },
                  "weekdayOrdinal": {
                    "enum": [
                      "first",
                      "second",
                      "third",
                      "fourth",
                      "fifth",
                      "last",
                      "secondLast"
                    ],
                    "type": "string",
                    "description": "Ordinal position of weekday in month"
                  },
                  "occurrenceCount": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "minimum": 1,
                    "description": "Number of occurrences before ending, or null if no occurrence limit"
                  },
                  "weekdayCategory": {
                    "enum": [
                      "day",
                      "weekday",
                      "weekend",
                      "monday",
                      "tuesday",
                      "wednesday",
                      "thursday",
                      "friday",
                      "saturday",
                      "sunday"
                    ],
                    "type": "string",
                    "description": "Category or specific weekday for monthly/yearly patterns"
                  },
                  "selectedWeekdays": {
                    "type": "array",
                    "items": {
                      "enum": [
                        "monday",
                        "tuesday",
                        "wednesday",
                        "thursday",
                        "friday",
                        "saturday",
                        "sunday"
                      ],
                      "type": "string"
                    },
                    "description": "Selected weekdays for weekly recurrence"
                  },
                  "selectedDaysOfMonth": {
                    "type": "array",
                    "items": {
                      "type": "integer"
                    },
                    "description": "Selected days of month (1-31, -1 for last day, -2 for second-last)"
                  }
                },
                "description": "Recurrence configuration, or null for a non-recurring event. An object represents repetition explicitly stated in the source or established by separately listed regular occurrences. A single bounded multi-day range is one occurrence with start_date/end_date. Recurrence objects require all schema fields with valid values; empty or partial objects are invalid.",
                "additionalProperties": false
              },
              "start_date": {
                "type": [
                  "string",
                  "null"
                ],
                "maxLength": 20000,
                "description": "Event start date in YYYY-MM-DD format, using the event timezone for timed events."
              },
              "start_time": {
                "type": [
                  "string",
                  "null"
                ],
                "maxLength": 20000,
                "description": "Local event start time in HH:mm format. All-day events have no clock time."
              },
              "description": {
                "type": [
                  "string",
                  "null"
                ],
                "maxLength": 20000,
                "description": "Event notes the user intends to publish with this calendar. Chat history, credentials, health records and unrelated personal context are outside this field’s scope."
              },
              "facet_topic": {
                "type": [
                  "string",
                  "null"
                ],
                "maxLength": 20000,
                "description": "Source-grounded stable category, not the full event title. Source-derived labels use the existing facet vocabulary, spelling and language. Unchanged fields retain their tags."
              },
              "facet_venue": {
                "type": [
                  "string",
                  "null"
                ],
                "maxLength": 20000,
                "description": "Source-grounded venue name. Source-derived labels use the existing facet vocabulary, spelling and language. Unchanged fields retain their tags."
              },
              "facet_actors": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                },
                "maxItems": 50,
                "description": "Source-grounded participants or organizers (people, teams or organizations), not an invented audience such as everyone at a school. Source-derived labels use the existing facet vocabulary, spelling and language. Unchanged fields retain their tags."
              }
            },
            "description": "Structured calendar fields for one event from the reviewed schedule.",
            "additionalProperties": false
          },
          "external_key": {
            "type": "string",
            "pattern": "^[A-Za-z0-9._-]{1,64}:[^\\s\\u0000-\\u001f]{1,190}$",
            "maxLength": 255,
            "minLength": 3,
            "description": "Source-stable, namespaced event identity, for example school-a:session-104, retained when a title or date changes. A duplicate add does not update the event; updates address the existing event_id."
          }
        },
        "additionalProperties": false
      },
      "maxItems": 250,
      "minItems": 1,
      "description": "One to 250 reviewed schedule entries. Each entry contains event fields and may include a source-stable external_key; the caller supplies this content."
    },
    "activate": {
      "type": "boolean",
      "default": true,
      "description": "Whether to activate the new calendar immediately, subject to the account active-feed allowance; defaults to true. False creates a saved inactive preview without subscription access."
    },
    "request_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9:_.-]+$",
      "maxLength": 160,
      "minLength": 1,
      "description": "Opaque, non-personal idempotency key for this operation. Identical retries retain the same key and payload to prevent duplicate changes. User identifiers, chat/session IDs, telemetry and personal data are outside this field’s scope."
    },
    "description": {
      "type": [
        "string",
        "null"
      ],
      "maxLength": 20000,
      "description": "A short description of this calendar, not the conversation or user profile."
    }
  },
  "additionalProperties": false
}
create_feed annotations
{
  "title": "Create a subscription calendar",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
list_feeds — List calendars
Advertised by the server during the last successful anonymous check.
Advertised read-only

Lists the connected account’s feeds, management links and shared active-feed allowance for a requested calendar lookup. Only feeds marked counts_towards_active_limit use a slot; this page’s length is not the account’s usage. Reading changes no feeds or subscription access. Scope is limited to the connected account’s Smart Calendars AI feeds. No mailbox access, source-document retrieval, automatic source monitoring, scheduled PDF checks or document refresh is provided. Structured schedule content is supplied explicitly by the caller. Result links: subscription_open_url is the exact HTTPS handoff to the default calendar app via webcal; subscription_options_url provides Apple/default, Google, Outlook and copy-link choices; subscription_url is the copyable HTTPS calendar-file fallback; manage_url opens the feed dashboard. URL hosts, paths and tokens identify the returned resource and are not interchangeable. A filtered_subscription has its own links for that selection; top-level links remain unfiltered. Subscription access requires distribution_ready=true. Opening a link does not confirm a subscription; confirmation occurs in the user’s calendar app.

list_feeds input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 100,
      "minimum": 1,
      "description": "Maximum calendars returned on this page, from 1 to 100; defaults to 50."
    },
    "offset": {
      "type": "integer",
      "minimum": 0,
      "description": "Number of matching results skipped before this page; defaults to 0. The response next_offset identifies the next page when present."
    }
  },
  "additionalProperties": false
}
list_feeds annotations
{
  "title": "List calendars",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_feed — Read calendar events
Advertised by the server during the last successful anonymous check.
Advertised read-only

Reads events and the current revision of a selected feed for a requested schedule lookup or revision. include_facets=true provides known facet values for label selection. Facets describe the entire published active feed, independent of read filters or pagination. Nonempty filters also return filtered_subscription with canonical filters, matching_event_count and unmatched_filter_values. Its nested URLs address that selection; top-level subscription URLs remain unfiltered. Event IDs, external keys, dates, removal state and pagination narrow only the read, never the subscription. Filtering changes no events and creates no cloned feed. A complete unfiltered read is a prerequisite for assessing cancellations from a revised schedule; omission from a filtered or paginated result is not evidence of deletion. Scope is limited to the connected account’s Smart Calendars AI feeds. No mailbox access, source-document retrieval, automatic source monitoring, scheduled PDF checks or document refresh is provided. Structured schedule content is supplied explicitly by the caller. Result links: subscription_open_url is the exact HTTPS handoff to the default calendar app via webcal; subscription_options_url provides Apple/default, Google, Outlook and copy-link choices; subscription_url is the copyable HTTPS calendar-file fallback; manage_url opens the feed dashboard. URL hosts, paths and tokens identify the returned resource and are not interchangeable. A filtered_subscription has its own links for that selection; top-level links remain unfiltered. Subscription access requires distribution_ready=true. Opening a link does not confirm a subscription; confirmation occurs in the user’s calendar app. Filter privacy: filters select events, not who can access them; anyone with the link can remove the filters and read the full published calendar.

get_feed input schema
{
  "type": "object",
  "required": [
    "feed_id"
  ],
  "properties": {
    "to": {
      "type": "string",
      "description": "Inclusive upper date bound in YYYY-MM-DD format. Events whose date span overlaps the requested range can match; omission leaves the upper bound open."
    },
    "from": {
      "type": "string",
      "description": "Inclusive lower date bound in YYYY-MM-DD format. Events whose date span overlaps the requested range can match; omission leaves the lower bound open."
    },
    "limit": {
      "type": "integer",
      "maximum": 250,
      "minimum": 1,
      "description": "Maximum events returned on this page, from 1 to 250; defaults to 100."
    },
    "offset": {
      "type": "integer",
      "minimum": 0,
      "description": "Number of matching results skipped before this page; defaults to 0. The response next_offset identifies the next page when present."
    },
    "feed_id": {
      "type": "string",
      "format": "uuid",
      "description": "Identity of the selected calendar returned in feed results."
    },
    "filters": {
      "type": "object",
      "required": [],
      "properties": {
        "city": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 1000,
            "minLength": 1
          },
          "maxItems": 20,
          "minItems": 1,
          "description": "An existing event-city facet selected from available_facets.city, not the user’s current city or residence. User geolocation is outside this field’s scope."
        },
        "topic": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 1000,
            "minLength": 1
          },
          "maxItems": 20,
          "minItems": 1,
          "description": "Existing topic or category labels from available_facets.topic."
        },
        "venue": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 1000,
            "minLength": 1
          },
          "maxItems": 20,
          "minItems": 1,
          "description": "An event venue selected from available_facets.venue, not a user-location lookup."
        },
        "format": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 1000,
            "minLength": 1
          },
          "maxItems": 20,
          "minItems": 1,
          "description": "Existing attendance-mode labels from available_facets.format, such as online or in-person; accepted aliases are normalized by the server."
        },
        "person": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 1000,
            "minLength": 1
          },
          "maxItems": 20,
          "minItems": 1,
          "description": "An event participant or organizer from available_facets.person, not an account or profile lookup."
        },
        "source": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 1000,
            "minLength": 1
          },
          "maxItems": 20,
          "minItems": 1,
          "description": "Child-feed/source identifier from available_facets.source, not a source URL."
        },
        "country": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 1000,
            "minLength": 1
          },
          "maxItems": 20,
          "minItems": 1,
          "description": "An existing event-country facet selected from available_facets.country, not the user’s nationality or residence. User geolocation is outside this field’s scope."
        },
        "organizer": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 1000,
            "minLength": 1
          },
          "maxItems": 20,
          "minItems": 1,
          "description": "Alias for person."
        },
        "attendance_mode": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 1000,
            "minLength": 1
          },
          "maxItems": 20,
          "minItems": 1,
          "description": "Alias for format."
        }
      },
      "description": "Values identify known labels from available_facets; include_facets=true provides that vocabulary. Values are trimmed and case-insensitive; format accepts attendance-mode aliases. Values within a field use OR; different fields use AND. Unknown values never broaden the selection. Filtering cannot infer missing metadata.",
      "additionalProperties": false
    },
    "event_ids": {
      "type": "array",
      "items": {
        "type": "string",
        "format": "uuid"
      },
      "maxItems": 250,
      "description": "Optional selection of up to 250 existing event IDs. Omitted or empty means no event-ID restriction. This narrows only the read."
    },
    "external_keys": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 250,
      "description": "Optional selection of up to 250 source-stable external keys. Omitted or empty means no external-key restriction. Combined with other read filters."
    },
    "removal_state": {
      "enum": [
        "active",
        "removed",
        "all"
      ],
      "type": "string",
      "description": "Event cancellation state to return: active excludes canceled events, removed returns canceled events, and all includes both. Defaults to active."
    },
    "include_facets": {
      "type": "boolean",
      "default": false,
      "description": "Includes available_facets ({value,label,count} entries), facet_coverage ({tagged_events,fallback_events,missing_events}), facets_truncated and facet_scope=published_active_events. Coverage distinguishes explicit tags, fallbacks and missing values; title/location fallbacks do not infer classifications or audiences. Nonempty filters also include these results. Canonical fields: person, venue, topic, city, country, format, source."
    }
  },
  "additionalProperties": false
}
get_feed annotations
{
  "title": "Read calendar events",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_feed_status — Check calendar status
Advertised by the server during the last successful anonymous check.
Advertised read-only

Reads a selected feed’s last update, current subscription availability (distribution_ready), editing access and configured monitoring status for a requested status check. This does not refresh, save or charge. Scope is limited to the connected account’s Smart Calendars AI feeds. No mailbox access, source-document retrieval, automatic source monitoring, scheduled PDF checks or document refresh is provided. Structured schedule content is supplied explicitly by the caller. Result links: subscription_open_url is the exact HTTPS handoff to the default calendar app via webcal; subscription_options_url provides Apple/default, Google, Outlook and copy-link choices; subscription_url is the copyable HTTPS calendar-file fallback; manage_url opens the feed dashboard. URL hosts, paths and tokens identify the returned resource and are not interchangeable. A filtered_subscription has its own links for that selection; top-level links remain unfiltered. Subscription access requires distribution_ready=true. Opening a link does not confirm a subscription; confirmation occurs in the user’s calendar app.

get_feed_status input schema
{
  "type": "object",
  "required": [
    "feed_id"
  ],
  "properties": {
    "feed_id": {
      "type": "string",
      "format": "uuid",
      "description": "Identity of the selected calendar returned in feed results."
    }
  },
  "additionalProperties": false
}
get_feed_status annotations
{
  "title": "Check calendar status",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
apply_feed_changes — Save a calendar revision
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Saves one revision to one existing calendar feed owned by the connected account for a user-approved schedule change. Accepts one fixed-schema change set with up to 250 event changes and/or a feed title or description change; all stored calendar changes commit together in one transaction, or none are saved. The schema declares every supported change: add creates an event; update changes selected fields or uses reset_fields to restore saved field baselines; delete marks an existing event canceled without permanently erasing it; restore reinstates that same event and may update selected fields; feed_patch changes only the calendar title or description. No dynamic operation discovery, fetched schemas, arbitrary commands or arbitrary endpoints are supported. dry_run=true validates and previews the proposed change set without saving calendar changes, advancing the revision or spending credits. The response contains the exact before/after changes and any billing quote. User approval of that exact preview is a prerequisite for saving with dry_run=false. Saving requires the returned preview_receipt and the identical feed_id, expected_revision, request_id, operations and feed_patch. The receipt binds that validated preview, not user consent. Changed proposals or expired previews require a new preview and approval; revision conflicts require current feed data and a new preview. Omitted events and fields remain unchanged. Cancellation assessment from a revised schedule requires the complete unfiltered event set; unrelated events and manual fields remain unchanged unless explicitly included in the approved changes. Uncertain event matches require user clarification. Updates address matched event IDs; a duplicate add is not an update. A recurring-series target is series_id with scope=occurrence, following or series; occurrence/following uses the original scheduled occurrence_date, including moved occurrences. reset_fields can include cancellation to restore source cancellation policy. Entire-series edits include history and all returned segments are part of the preview. Explicit null in set clears nullable fields; reset_fields restores saved baselines. expected_revision prevents overwriting concurrent changes. An uncertain save is retried with the identical request_id and payload, including the original preview_receipt, rather than a new operation. Included editing access has no credit charge or credit-consent prompt. A quoted one-credit editing window requires explicit user authorization of the deduction and resulting balance before confirm_credit_charge=true; that authorization may be added after preview. Preview approval or an automation default does not authorize credit spending. publication.status reports calendar-file preparation, not subscription access. distribution_ready reports subscription availability at the returned revision; availability may change afterward. Preview proposals are recoverable for up to one hour; expired drafts are removed automatically. Previewing temporarily stores only the exact proposed calendar fields, without writing calendar events or advancing their revision. Returned feed_id and request_id identify that exact proposal for recovery. Recovery accepts only feed_id, the original request_id, dry_run=true and recover_preview=true. Reconstructed changes, guessed identifiers and latest-preview selection are unsupported. Recovery returns the original unexpired preview and exact save_arguments without extending expiry, saving or spending credits. Saving a recovered preview requires fresh user approval of its exact changes and the returned save_arguments unchanged; confirm_credit_charge remains false without explicit authorization of the current quoted charge. Recovery is not consent. Recovery with saved=true reports an already completed save and requires no additional save. An unavailable or expired proposal requires current feed data, a new request_id, a new preview and user approval; a changed proposal is a new approval decision. Scope is limited to the connected account’s Smart Calendars AI feeds. No mailbox access, source-document retrieval, automatic source monitoring, scheduled PDF checks or document refresh is provided. Structured schedule content is supplied explicitly by the caller. Result links: subscription_open_url is the exact HTTPS handoff to the default calendar app via webcal; subscription_options_url provides Apple/default, Google, Outlook and copy-link choices; subscription_url is the copyable HTTPS calendar-file fallback; manage_url opens the feed dashboard. URL hosts, paths and tokens identify the returned resource and are not interchangeable. A filtered_subscription has its own links for that selection; top-level links remain unfiltered. Subscription access requires distribution_ready=true. Opening a link does not confirm a subscription; confirmation occurs in the user’s calendar app.

apply_feed_changes input schema
{
  "type": "object",
  "required": [
    "feed_id",
    "request_id"
  ],
  "properties": {
    "dry_run": {
      "type": "boolean",
      "default": false,
      "description": "True previews and validates the exact proposed changes without changing calendar events, advancing the revision or spending credits. The preview returns before/after changes, any billing quote and a preview_receipt. False saves the same proposal using its valid preview_receipt. The receipt proves preview integrity, not user approval; preview approval and any required credit authorization remain separate prerequisites. Defaults to false."
    },
    "feed_id": {
      "type": "string",
      "format": "uuid",
      "description": "Identity of the selected calendar, as returned in feed results."
    },
    "feed_patch": {
      "type": "object",
      "required": [],
      "properties": {
        "title": {
          "type": "string",
          "description": "Replacement calendar title."
        },
        "description": {
          "type": [
            "string",
            "null"
          ],
          "description": "Replacement short calendar description, or null to clear it. Conversation history and user-profile data are outside this field’s scope."
        }
      },
      "description": "Proposed calendar title and/or description changes for this revision. Omitted fields stay unchanged.",
      "additionalProperties": false
    },
    "operations": {
      "type": "array",
      "items": {
        "oneOf": [
          {
            "type": "object",
            "required": [
              "op",
              "event"
            ],
            "properties": {
              "op": {
                "const": "add",
                "description": "Adds a new event using the supplied event fields and optional source-stable external_key."
              },
              "event": {
                "type": "object",
                "required": [
                  "title",
                  "start_date",
                  "is_all_day"
                ],
                "properties": {
                  "title": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 20000,
                    "description": "Event title from the supplied schedule."
                  },
                  "assignee": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 20000,
                    "description": "Optional event assignee explicitly named in the schedule; not the connected account identity, email address or a user profile."
                  },
                  "end_date": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 20000,
                    "description": "Inclusive last calendar date, YYYY-MM-DD. A bounded multi-day range represents one event unless the user requests separate events."
                  },
                  "end_time": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 20000,
                    "description": "Local event end time in HH:mm format, on end_date when supplied or start_date otherwise. All-day events have no clock time."
                  },
                  "location": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 20000,
                    "description": "The event venue explicitly supplied in the schedule or requested correction, not the user’s current, home or device location. User geolocation is outside this field’s scope."
                  },
                  "timezone": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 20000,
                    "description": "IANA timezone for the event local dates and times, for example Europe/Berlin or UTC."
                  },
                  "is_all_day": {
                    "type": "boolean",
                    "description": "True for an all-day calendar event with dates and no clock times; false for a timed event with a local start time and optional end time."
                  },
                  "recurrence": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "required": [
                      "frequency",
                      "interval",
                      "selectedWeekdays",
                      "monthlyType",
                      "selectedDaysOfMonth",
                      "weekdayOrdinal",
                      "weekdayCategory",
                      "selectedMonths",
                      "endDate",
                      "occurrenceCount"
                    ],
                    "properties": {
                      "endDate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "End date for recurrence in YYYY-MM-DD format, or null if no end date"
                      },
                      "interval": {
                        "type": "integer",
                        "maximum": 999,
                        "minimum": 1,
                        "description": "Interval between recurrences (e.g., 2 for every 2 weeks)"
                      },
                      "frequency": {
                        "enum": [
                          "daily",
                          "weekly",
                          "monthly",
                          "yearly"
                        ],
                        "type": "string",
                        "description": "Base recurrence frequency"
                      },
                      "monthlyType": {
                        "enum": [
                          "dayOfMonth",
                          "dayOfWeek"
                        ],
                        "type": "string",
                        "description": "Type of monthly recurrence: by date or by weekday pattern"
                      },
                      "selectedMonths": {
                        "type": "array",
                        "items": {
                          "type": "integer",
                          "maximum": 12,
                          "minimum": 1
                        },
                        "description": "Selected months for yearly recurrence (1-12)"
                      },
                      "weekdayOrdinal": {
                        "enum": [
                          "first",
                          "second",
                          "third",
                          "fourth",
                          "fifth",
                          "last",
                          "secondLast"
                        ],
                        "type": "string",
                        "description": "Ordinal position of weekday in month"
                      },
                      "occurrenceCount": {
                        "type": [
                          "integer",
                          "null"
                        ],
                        "minimum": 1,
                        "description": "Number of occurrences before ending, or null if no occurrence limit"
                      },
                      "weekdayCategory": {
                        "enum": [
                          "day",
                          "weekday",
                          "weekend",
                          "monday",
                          "tuesday",
                          "wednesday",
                          "thursday",
                          "friday",
                          "saturday",
                          "sunday"
                        ],
                        "type": "string",
                        "description": "Category or specific weekday for monthly/yearly patterns"
                      },
                      "selectedWeekdays": {
                        "type": "array",
                        "items": {
                          "enum": [
                            "monday",
                            "tuesday",
                            "wednesday",
                            "thursday",
                            "friday",
                            "saturday",
                            "sunday"
                          ],
                          "type": "string"
                        },
                        "description": "Selected weekdays for weekly recurrence"
                      },
                      "selectedDaysOfMonth": {
                        "type": "array",
                        "items": {
                          "type": "integer"
                        },
                        "description": "Selected days of month (1-31, -1 for last day, -2 for second-last)"
                      }
                    },
                    "description": "Recurrence configuration, or null for a non-recurring event. An object represents repetition explicitly stated in the source or established by separately listed regular occurrences. A single bounded multi-day range is one occurrence with start_date/end_date. Recurrence objects require all schema fields with valid values; empty or partial objects are invalid.",
                    "additionalProperties": false
                  },
                  "start_date": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 20000,
                    "description": "Event start date in YYYY-MM-DD format, using the event timezone for timed events."
                  },
                  "start_time": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 20000,
                    "description": "Local event start time in HH:mm format. All-day events have no clock time."
                  },
                  "description": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 20000,
                    "description": "Event notes the user intends to publish with this calendar. Chat history, credentials, health records and unrelated personal context are outside this field’s scope."
                  },
                  "facet_topic": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 20000,
                    "description": "Source-grounded stable category, not the full event title. Source-derived labels use the existing facet vocabulary, spelling and language. Unchanged fields retain their tags."
                  },
                  "facet_venue": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 20000,
                    "description": "Source-grounded venue name. Source-derived labels use the existing facet vocabulary, spelling and language. Unchanged fields retain their tags."
                  },
                  "facet_actors": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "items": {
                      "type": "string"
                    },
                    "maxItems": 50,
                    "description": "Source-grounded participants or organizers (people, teams or organizations), not an invented audience such as everyone at a school. Source-derived labels use the existing facet vocabulary, spelling and language. Unchanged fields retain their tags."
                  }
                },
                "description": "Structured calendar fields for one event from the reviewed schedule.",
                "additionalProperties": false
              },
              "external_key": {
                "type": "string",
                "pattern": "^[A-Za-z0-9._-]{1,64}:[^\\s\\u0000-\\u001f]{1,190}$",
                "maxLength": 255,
                "minLength": 3,
                "description": "Source-stable, namespaced event identity, for example school-a:session-104, retained when a title or date changes. A duplicate add does not update the event; updates address the existing event_id."
              }
            },
            "additionalProperties": false
          },
          {
            "type": "object",
            "oneOf": [
              {
                "not": {
                  "required": [
                    "series_id"
                  ]
                },
                "required": [
                  "event_id"
                ]
              },
              {
                "not": {
                  "required": [
                    "event_id"
                  ]
                },
                "required": [
                  "series_id",
                  "scope"
                ]
              }
            ],
            "required": [
              "op"
            ],
            "properties": {
              "op": {
                "const": "update",
                "description": "Updates selected fields or resets selected overrides on an existing event or recurring-series target."
              },
              "set": {
                "type": "object",
                "required": [],
                "properties": {
                  "title": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 20000,
                    "description": "Event title from the supplied schedule."
                  },
                  "assignee": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 20000,
                    "description": "Optional event assignee explicitly named in the schedule; not the connected account identity, email address or a user profile."
                  },
                  "end_date": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 20000,
                    "description": "Inclusive last calendar date, YYYY-MM-DD. A bounded multi-day range represents one event unless the user requests separate events."
                  },
                  "end_time": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 20000,
                    "description": "Local event end time in HH:mm format, on end_date when supplied or start_date otherwise. All-day events have no clock time."
                  },
                  "location": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 20000,
                    "description": "The event venue explicitly supplied in the schedule or requested correction, not the user’s current, home or device location. User geolocation is outside this field’s scope."
                  },
                  "timezone": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 20000,
                    "description": "IANA timezone for the event local dates and times, for example Europe/Berlin or UTC."
                  },
                  "is_all_day": {
                    "type": "boolean",
                    "description": "True for an all-day calendar event with dates and no clock times; false for a timed event with a local start time and optional end time."
                  },
                  "recurrence": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "required": [
                      "frequency",
                      "interval",
                      "selectedWeekdays",
                      "monthlyType",
                      "selectedDaysOfMonth",
                      "weekdayOrdinal",
                      "weekdayCategory",
                      "selectedMonths",
                      "endDate",
                      "occurrenceCount"
                    ],
                    "properties": {
                      "endDate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "End date for recurrence in YYYY-MM-DD format, or null if no end date"
                      },
                      "interval": {
                        "type": "integer",
                        "maximum": 999,
                        "minimum": 1,
                        "description": "Interval between recurrences (e.g., 2 for every 2 weeks)"
                      },
                      "frequency": {
                        "enum": [
                          "daily",
                          "weekly",
                          "monthly",
                          "yearly"
                        ],
                        "type": "string",
                        "description": "Base recurrence frequency"
                      },
                      "monthlyType": {
                        "enum": [
                          "dayOfMonth",
                          "dayOfWeek"
                        ],
                        "type": "string",
                        "description": "Type of monthly recurrence: by date or by weekday pattern"
                      },
                      "selectedMonths": {
                        "type": "array",
                        "items": {
                          "type": "integer",
                          "maximum": 12,
                          "minimum": 1
                        },
                        "description": "Selected months for yearly recurrence (1-12)"
                      },
                      "weekdayOrdinal": {
                        "enum": [
                          "first",
                          "second",
                          "third",
                          "fourth",
                          "fifth",
                          "last",
                          "secondLast"
                        ],
                        "type": "string",
                        "description": "Ordinal position of weekday in month"
                      },
                      "occurrenceCount": {
                        "type": [
                          "integer",
                          "null"
                        ],
                        "minimum": 1,
                        "description": "Number of occurrences before ending, or null if no occurrence limit"
                      },
                      "weekdayCategory": {
                        "enum": [
                          "day",
                          "weekday",
                          "weekend",
                          "monday",
                          "tuesday",
                          "wednesday",
                          "thursday",
                          "friday",
                          "saturday",
                          "sunday"
                        ],
                        "type": "string",
                        "description": "Category or specific weekday for monthly/yearly patterns"
                      },
                      "selectedWeekdays": {
                        "type": "array",
                        "items": {
                          "enum": [
                            "monday",
                            "tuesday",
                            "wednesday",
                            "thursday",
                            "friday",
                            "saturday",
                            "sunday"
                          ],
                          "type": "string"
                        },
                        "description": "Selected weekdays for weekly recurrence"
                      },
                      "selectedDaysOfMonth": {
                        "type": "array",
                        "items": {
                          "type": "integer"
                        },
                        "description": "Selected days of month (1-31, -1 for last day, -2 for second-last)"
                      }
                    },
                    "description": "Recurrence configuration, or null for a non-recurring event. An object represents repetition explicitly stated in the source or established by separately listed regular occurrences. A single bounded multi-day range is one occurrence with start_date/end_date. Recurrence objects require all schema fields with valid values; empty or partial objects are invalid.",
                    "additionalProperties": false
                  },
                  "start_date": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 20000,
                    "description": "Event start date in YYYY-MM-DD format, using the event timezone for timed events."
                  },
                  "start_time": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 20000,
                    "description": "Local event start time in HH:mm format. All-day events have no clock time."
                  },
                  "description": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 20000,
                    "description": "Event notes the user intends to publish with this calendar. Chat history, credentials, health records and unrelated personal context are outside this field’s scope."
                  },
                  "facet_topic": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 20000,
                    "description": "Source-grounded stable category, not the full event title. Source-derived labels use the existing facet vocabulary, spelling and language. Unchanged fields retain their tags."
                  },
                  "facet_venue": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 20000,
                    "description": "Source-grounded venue name. Source-derived labels use the existing facet vocabulary, spelling and language. Unchanged fields retain their tags."
                  },
                  "facet_actors": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "items": {
                      "type": "string"
                    },
                    "maxItems": 50,
                    "description": "Source-grounded participants or organizers (people, teams or organizations), not an invented audience such as everyone at a school. Source-derived labels use the existing facet vocabulary, spelling and language. Unchanged fields retain their tags."
                  }
                },
                "description": "Only supplied fields change. Omitted fields stay unchanged. Explicit null clears a nullable field, for example {\"location\":null,\"description\":null}; it does not restore its baseline.",
                "additionalProperties": false
              },
              "scope": {
                "enum": [
                  "occurrence",
                  "following",
                  "series"
                ],
                "description": "Extent of a series change: occurrence affects one occurrence, following affects that occurrence and later ones, and series affects the entire series including history."
              },
              "event_id": {
                "type": "string",
                "format": "uuid",
                "description": "Identity of the existing event returned with the calendar event data. An event target is an alternative to series_id and scope."
              },
              "series_id": {
                "type": "string",
                "format": "uuid",
                "description": "Identity of the recurring series returned with the calendar event data. A series target is an alternative to event_id."
              },
              "reset_fields": {
                "type": "array",
                "items": {
                  "enum": [
                    "title",
                    "description",
                    "location",
                    "start_date",
                    "end_date",
                    "start_time",
                    "end_time",
                    "timezone",
                    "assignee",
                    "facet_venue",
                    "facet_topic",
                    "recurrence",
                    "is_all_day",
                    "facet_actors",
                    "cancellation"
                  ]
                },
                "minItems": 1,
                "description": "Selected overrides whose saved baselines are restored. A field without an override stays unchanged, including values supplied when adding the event. Explicit null in set clears a nullable field; reset_fields restores its baseline. The same field in both set and reset_fields is invalid.",
                "uniqueItems": true
              },
              "occurrence_date": {
                "type": "string",
                "format": "date",
                "description": "Original scheduled occurrence date in YYYY-MM-DD format for occurrence or following scope, including when the occurrence has moved."
              }
            },
            "additionalProperties": false
          },
          {
            "type": "object",
            "oneOf": [
              {
                "not": {
                  "required": [
                    "series_id"
                  ]
                },
                "required": [
                  "event_id"
                ]
              },
              {
                "not": {
                  "required": [
                    "event_id"
                  ]
                },
                "required": [
                  "series_id",
                  "scope"
                ]
              }
            ],
            "required": [
              "op"
            ],
            "properties": {
              "op": {
                "const": "delete",
                "description": "Marks an existing event or recurring-series target canceled without permanently erasing it."
              },
              "scope": {
                "enum": [
                  "occurrence",
                  "following",
                  "series"
                ],
                "description": "Extent of a series change: occurrence affects one occurrence, following affects that occurrence and later ones, and series affects the entire series including history."
              },
              "event_id": {
                "type": "string",
                "format": "uuid",
                "description": "Identity of the existing event returned with the calendar event data. An event target is an alternative to series_id and scope."
              },
              "series_id": {
                "type": "string",
                "format": "uuid",
                "description": "Identity of the recurring series returned with the calendar event data. A series target is an alternative to event_id."
              },
              "occurrence_date": {
                "type": "string",
                "format": "date",
                "description": "Original scheduled occurrence date in YYYY-MM-DD format for occurrence or following scope, including when the occurrence has moved."
              }
            },
            "additionalProperties": false
          },
          {
            "type": "object",
            "oneOf": [
              {
                "not": {
                  "required": [
                    "series_id"
                  ]
                },
                "required": [
                  "event_id"
                ]
              },
              {
                "not": {
                  "required": [
                    "event_id"
                  ]
                },
                "required": [
                  "series_id",
                  "scope"
                ]
              }
            ],
            "required": [
              "op"
            ],
            "properties": {
              "op": {
                "const": "restore",
                "description": "Restores a canceled event or recurring-series target, optionally applying supplied field changes."
              },
              "set": {
                "type": "object",
                "required": [],
                "properties": {
                  "title": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 20000,
                    "description": "Event title from the supplied schedule."
                  },
                  "assignee": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 20000,
                    "description": "Optional event assignee explicitly named in the schedule; not the connected account identity, email address or a user profile."
                  },
                  "end_date": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 20000,
                    "description": "Inclusive last calendar date, YYYY-MM-DD. A bounded multi-day range represents one event unless the user requests separate events."
                  },
                  "end_time": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 20000,
                    "description": "Local event end time in HH:mm format, on end_date when supplied or start_date otherwise. All-day events have no clock time."
                  },
                  "location": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 20000,
                    "description": "The event venue explicitly supplied in the schedule or requested correction, not the user’s current, home or device location. User geolocation is outside this field’s scope."
                  },
                  "timezone": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 20000,
                    "description": "IANA timezone for the event local dates and times, for example Europe/Berlin or UTC."
                  },
                  "is_all_day": {
                    "type": "boolean",
                    "description": "True for an all-day calendar event with dates and no clock times; false for a timed event with a local start time and optional end time."
                  },
                  "recurrence": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "required": [
                      "frequency",
                      "interval",
                      "selectedWeekdays",
                      "monthlyType",
                      "selectedDaysOfMonth",
                      "weekdayOrdinal",
                      "weekdayCategory",
                      "selectedMonths",
                      "endDate",
                      "occurrenceCount"
                    ],
                    "properties": {
                      "endDate": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "End date for recurrence in YYYY-MM-DD format, or null if no end date"
                      },
                      "interval": {
                        "type": "integer",
                        "maximum": 999,
                        "minimum": 1,
                        "description": "Interval between recurrences (e.g., 2 for every 2 weeks)"
                      },
                      "frequency": {
                        "enum": [
                          "daily",
                          "weekly",
                          "monthly",
                          "yearly"
                        ],
                        "type": "string",
                        "description": "Base recurrence frequency"
                      },
                      "monthlyType": {
                        "enum": [
                          "dayOfMonth",
                          "dayOfWeek"
                        ],
                        "type": "string",
                        "description": "Type of monthly recurrence: by date or by weekday pattern"
                      },
                      "selectedMonths": {
                        "type": "array",
                        "items": {
                          "type": "integer",
                          "maximum": 12,
                          "minimum": 1
                        },
                        "description": "Selected months for yearly recurrence (1-12)"
                      },
                      "weekdayOrdinal": {
                        "enum": [
                          "first",
                          "second",
                          "third",
                          "fourth",
                          "fifth",
                          "last",
                          "secondLast"
                        ],
                        "type": "string",
                        "description": "Ordinal position of weekday in month"
                      },
                      "occurrenceCount": {
                        "type": [
                          "integer",
                          "null"
                        ],
                        "minimum": 1,
                        "description": "Number of occurrences before ending, or null if no occurrence limit"
                      },
                      "weekdayCategory": {
                        "enum": [
                          "day",
                          "weekday",
                          "weekend",
                          "monday",
                          "tuesday",
                          "wednesday",
                          "thursday",
                          "friday",
                          "saturday",
                          "sunday"
                        ],
                        "type": "string",
                        "description": "Category or specific weekday for monthly/yearly patterns"
                      },
                      "selectedWeekdays": {
                        "type": "array",
                        "items": {
                          "enum": [
                            "monday",
                            "tuesday",
                            "wednesday",
                            "thursday",
                            "friday",
                            "saturday",
                            "sunday"
                          ],
                          "type": "string"
                        },
                        "description": "Selected weekdays for weekly recurrence"
                      },
                      "selectedDaysOfMonth": {
                        "type": "array",
                        "items": {
                          "type": "integer"
                        },
                        "description": "Selected days of month (1-31, -1 for last day, -2 for second-last)"
                      }
                    },
                    "description": "Recurrence configuration, or null for a non-recurring event. An object represents repetition explicitly stated in the source or established by separately listed regular occurrences. A single bounded multi-day range is one occurrence with start_date/end_date. Recurrence objects require all schema fields with valid values; empty or partial objects are invalid.",
                    "additionalProperties": false
                  },
                  "start_date": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 20000,
                    "description": "Event start date in YYYY-MM-DD format, using the event timezone for timed events."
                  },
                  "start_time": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 20000,
                    "description": "Local event start time in HH:mm format. All-day events have no clock time."
                  },
                  "description": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 20000,
                    "description": "Event notes the user intends to publish with this calendar. Chat history, credentials, health records and unrelated personal context are outside this field’s scope."
                  },
                  "facet_topic": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 20000,
                    "description": "Source-grounded stable category, not the full event title. Source-derived labels use the existing facet vocabulary, spelling and language. Unchanged fields retain their tags."
                  },
                  "facet_venue": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 20000,
                    "description": "Source-grounded venue name. Source-derived labels use the existing facet vocabulary, spelling and language. Unchanged fields retain their tags."
                  },
                  "facet_actors": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "items": {
                      "type": "string"
                    },
                    "maxItems": 50,
                    "description": "Source-grounded participants or organizers (people, teams or organizations), not an invented audience such as everyone at a school. Source-derived labels use the existing facet vocabulary, spelling and language. Unchanged fields retain their tags."
                  }
                },
                "description": "Only supplied fields change. Omitted fields stay unchanged. Explicit null clears a nullable field, for example {\"location\":null,\"description\":null}; it does not restore its baseline.",
                "additionalProperties": false
              },
              "scope": {
                "enum": [
                  "occurrence",
                  "following",
                  "series"
                ],
                "description": "Extent of a series change: occurrence affects one occurrence, following affects that occurrence and later ones, and series affects the entire series including history."
              },
              "event_id": {
                "type": "string",
                "format": "uuid",
                "description": "Identity of the existing event returned with the calendar event data. An event target is an alternative to series_id and scope."
              },
              "series_id": {
                "type": "string",
                "format": "uuid",
                "description": "Identity of the recurring series returned with the calendar event data. A series target is an alternative to event_id."
              },
              "occurrence_date": {
                "type": "string",
                "format": "date",
                "description": "Original scheduled occurrence date in YYYY-MM-DD format for occurrence or following scope, including when the occurrence has moved."
              }
            },
            "additionalProperties": false
          }
        ]
      },
      "maxItems": 250,
      "description": "Proposed event additions, updates, cancellations or restorations for this revision, with at most 250 operations. Saved operations and feed_patch commit together or none are saved."
    },
    "request_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9:_.-]+$",
      "maxLength": 160,
      "minLength": 1,
      "description": "Opaque, non-personal idempotency key for this operation. Identical retries retain the same key and payload to prevent duplicate changes. User identifiers, chat/session IDs, telemetry and personal data are outside this field’s scope."
    },
    "preview_receipt": {
      "type": "string",
      "maxLength": 2048,
      "minLength": 1,
      "description": "Opaque receipt returned by a successful dry_run=true preview. Saving with dry_run=false requires the unchanged receipt and identical feed, revision, request_id and proposed changes. The receipt proves preview integrity, not user approval."
    },
    "recover_preview": {
      "type": "boolean",
      "default": false,
      "description": "Recovery of the exact unexpired preview by its original request_id. Requires only feed_id, the original request_id, dry_run=true and recover_preview=true; all other arguments are invalid. Recovery does not save, extend expiry or authorize a charge. Saving a recovered proposal requires fresh user approval of its returned preview. Guessed identifiers and latest-preview selection are unsupported."
    },
    "expected_revision": {
      "type": "integer",
      "minimum": 0,
      "description": "Last read feed revision; prevents overwriting concurrent edits."
    },
    "confirm_credit_charge": {
      "type": "boolean",
      "default": false,
      "description": "True only for explicit user authorization of the current quoted credit deduction and resulting balance. Preview approval alone, a recovered receipt or an automation default does not authorize credit spending."
    }
  },
  "additionalProperties": false
}
apply_feed_changes annotations
{
  "title": "Save a calendar revision",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": true
}
deactivate_feed — Deactivate a calendar
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Deactivates a feed for an explicit user request to interrupt its subscription access, without deleting events or resetting editing windows. User approval of that access interruption is required. A counted active feed releases its allowance slot. publication.status reports calendar-file preparation, not subscription access. distribution_ready reports subscription availability at the returned revision; availability may change afterward. Scope is limited to the connected account’s Smart Calendars AI feeds. No mailbox access, source-document retrieval, automatic source monitoring, scheduled PDF checks or document refresh is provided. Structured schedule content is supplied explicitly by the caller. Result links: subscription_open_url is the exact HTTPS handoff to the default calendar app via webcal; subscription_options_url provides Apple/default, Google, Outlook and copy-link choices; subscription_url is the copyable HTTPS calendar-file fallback; manage_url opens the feed dashboard. URL hosts, paths and tokens identify the returned resource and are not interchangeable. A filtered_subscription has its own links for that selection; top-level links remain unfiltered. Subscription access requires distribution_ready=true. Opening a link does not confirm a subscription; confirmation occurs in the user’s calendar app.

deactivate_feed input schema
{
  "type": "object",
  "required": [
    "feed_id",
    "expected_revision",
    "request_id"
  ],
  "properties": {
    "feed_id": {
      "type": "string",
      "format": "uuid",
      "description": "Identity of the selected calendar, as returned in feed results."
    },
    "request_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9:_.-]+$",
      "maxLength": 160,
      "minLength": 1,
      "description": "Opaque, non-personal idempotency key for this operation. Identical retries retain the same key and payload to prevent duplicate changes. User identifiers, chat/session IDs, telemetry and personal data are outside this field’s scope."
    },
    "expected_revision": {
      "type": "integer",
      "minimum": 0,
      "description": "Last read feed revision; prevents overwriting concurrent edits."
    }
  },
  "additionalProperties": false
}
deactivate_feed annotations
{
  "title": "Deactivate a calendar",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": true
}
reactivate_feed — Reactivate a calendar
Advertised by the server during the last successful anonymous check.
Open-world

Reactivates an existing feed for an explicit user request to restore its subscription access, subject to existing account allowances. Does not reset the original editing window or modify events. publication.status reports calendar-file preparation, not subscription access. distribution_ready reports subscription availability at the returned revision; availability may change afterward. Scope is limited to the connected account’s Smart Calendars AI feeds. No mailbox access, source-document retrieval, automatic source monitoring, scheduled PDF checks or document refresh is provided. Structured schedule content is supplied explicitly by the caller. Result links: subscription_open_url is the exact HTTPS handoff to the default calendar app via webcal; subscription_options_url provides Apple/default, Google, Outlook and copy-link choices; subscription_url is the copyable HTTPS calendar-file fallback; manage_url opens the feed dashboard. URL hosts, paths and tokens identify the returned resource and are not interchangeable. A filtered_subscription has its own links for that selection; top-level links remain unfiltered. Subscription access requires distribution_ready=true. Opening a link does not confirm a subscription; confirmation occurs in the user’s calendar app.

reactivate_feed input schema
{
  "type": "object",
  "required": [
    "feed_id",
    "expected_revision",
    "request_id"
  ],
  "properties": {
    "feed_id": {
      "type": "string",
      "format": "uuid",
      "description": "Identity of the selected calendar, as returned in feed results."
    },
    "request_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9:_.-]+$",
      "maxLength": 160,
      "minLength": 1,
      "description": "Opaque, non-personal idempotency key for this operation. Identical retries retain the same key and payload to prevent duplicate changes. User identifiers, chat/session IDs, telemetry and personal data are outside this field’s scope."
    },
    "expected_revision": {
      "type": "integer",
      "minimum": 0,
      "description": "Last read feed revision; prevents overwriting concurrent edits."
    }
  },
  "additionalProperties": false
}
reactivate_feed annotations
{
  "title": "Reactivate a calendar",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
1685 ms
95th percentile latency
1685 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 1685 ms · metadata changed · 7 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http smart-calendars-ai-mcp https://api.smartcalendars.ai/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add smart-calendars-ai-mcp --url https://api.smartcalendars.ai/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable smart-calendars-ai-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "smart-calendars-ai-mcp": {
      "url": "https://api.smartcalendars.ai/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "smart-calendars-ai-mcp": {
      "type": "streamableHttp",
      "url": "https://api.smartcalendars.ai/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start smart-calendars-ai-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "smart-calendars-ai-mcp": {
      "type": "http",
      "url": "https://api.smartcalendars.ai/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http smart-calendars-ai-mcp https://api.smartcalendars.ai/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "smart-calendars-ai-mcp": {
      "url": "https://api.smartcalendars.ai/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "smart-calendars-ai-mcp": {
      "serverUrl": "https://api.smartcalendars.ai/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Smart Calendars AI MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run Smart Calendars AI MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing