AVAILABLE

Scheduling

iCalendar Parse & Schedule Guard

Inspect and parse iCalendar text, expand recurrence, find event overlaps, and calculate busy/free windows with explicit timezone and DST policies.

CONTRACT

Predictable for agents. Legible for reviewers.

REST
POST /v1/icalendar/inspect
MCP tool
inspect_icalendar
Inputs
Up to 256 KiB of caller-supplied iCalendar text. Expansion, conflict, and availability operations also require an explicit RFC 3339 window, IANA interpretation timezone, DST-fold policy, and occurrence cap.
Returns
CLEAR, REVIEW_REQUIRED, or BLOCKED with named interoperability issues; a normalized VEVENT model; bounded RRULE/RDATE/EXDATE/RECURRENCE-ID occurrences; positive-duration conflicts; or merged half-open busy and free intervals.
Latency
Synchronous
Usage unit
iCalendar operation

The focused suite also exposes /v1/icalendar/parse, /v1/icalendar/expand, /v1/icalendar/conflicts, and /v1/icalendar/availability plus the separate /mcp/icalendar server. It never fetches a calendar URL, attachment, organizer, attendee, or event URL; sends no invitation; changes no calendar; and infers no attendee availability. Floating and all-day values are interpreted only under the supplied IANA zone. Repeated local times require REJECT, EARLIER, or LATER explicitly. Conflict and availability intervals are half-open, so one event ending exactly when another starts is not an overlap.

AGENT-READABLE EXCEPTIONS

ICAL_COMPONENT_MISMATCHICAL_VERSION_UNSUPPORTEDICAL_EVENT_UID_MISSINGICAL_UNKNOWN_TIME_ZONEICAL_LOCAL_TIME_AMBIGUOUSICAL_RECURRENCE_FREQUENCY_TOO_DENSEICAL_OCCURRENCE_LIMIT_EXCEEDEDICAL_CONFLICT_LIMIT_EXCEEDEDICAL_OUTPUT_TOO_LARGE
HTTP request
POST /v1/icalendar/availability
Authorization: Bearer apc_...
Content-Type: application/json

{
  "ics": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Example//EN\r\nBEGIN:VEVENT\r\nUID:standup@example.com\r\nDTSTAMP:20260810T120000Z\r\nDTSTART;TZID=America/Denver:20260811T090000\r\nDTEND;TZID=America/Denver:20260811T093000\r\nRRULE:FREQ=DAILY;COUNT=3\r\nSUMMARY:Operations standup\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n",
  "window_start": "2026-08-11T14:00:00Z",
  "window_end": "2026-08-11T18:00:00Z",
  "interpretation_time_zone": "America/Denver",
  "dst_disambiguation": "REJECT",
  "max_occurrences": 100,
  "include_tentative": true
}
cURL (bash)
curl --request POST \
  --url 'https://api-production-9502.up.railway.app/v1/icalendar/availability' \
  --header 'Authorization: Bearer ${AP_CONTROL_API_KEY}' \
  --header 'Content-Type: application/json' \
  --data '{
  "ics": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Example//EN\r\nBEGIN:VEVENT\r\nUID:standup@example.com\r\nDTSTAMP:20260810T120000Z\r\nDTSTART;TZID=America/Denver:20260811T090000\r\nDTEND;TZID=America/Denver:20260811T093000\r\nRRULE:FREQ=DAILY;COUNT=3\r\nSUMMARY:Operations standup\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n",
  "window_start": "2026-08-11T14:00:00Z",
  "window_end": "2026-08-11T18:00:00Z",
  "interpretation_time_zone": "America/Denver",
  "dst_disambiguation": "REJECT",
  "max_occurrences": 100,
  "include_tentative": true
}'
Representative response
{
  "status": "COMPLETED",
  "decision": "CLEAR",
  "source_sha256": "c2a1...",
  "window_start_utc": "2026-08-11T14:00:00Z",
  "window_end_utc": "2026-08-11T18:00:00Z",
  "busy_seconds": 1800,
  "free_seconds": 12600,
  "busy": [
    {
      "start_utc": "2026-08-11T15:00:00Z",
      "end_utc": "2026-08-11T15:30:00Z",
      "duration_seconds": 1800,
      "occurrence_ids": [
        "b7d9..."
      ]
    }
  ],
  "free": [
    {
      "start_utc": "2026-08-11T14:00:00Z",
      "end_utc": "2026-08-11T15:00:00Z",
      "duration_seconds": 3600,
      "occurrence_ids": []
    },
    {
      "start_utc": "2026-08-11T15:30:00Z",
      "end_utc": "2026-08-11T18:00:00Z",
      "duration_seconds": 9000,
      "occurrence_ids": []
    }
  ],
  "excluded_transparent_count": 0,
  "excluded_cancelled_count": 0,
  "excluded_tentative_count": 0,
  "issues": [],
  "ruleset_version": "2026-08-10",
  "next_action": "Use the returned half-open free intervals only under the documented status and transparency policy; confirm attendees and external calendars separately."
}
No fetching or writesThe API accepts supplied text only; it never downloads a feed or attachment, sends an invitation, or changes a calendar.
Bounded recurrenceExpansion requires an explicit window, IANA interpretation zone, occurrence cap, and conservative work budget; SECONDLY and MINUTELY rules are rejected.
Explicit schedule semanticsDST folds are never silently selected, intervals are half-open, and returned free time does not infer attendee or external-calendar availability.

Use iCalendar Parse & Schedule Guard through RapidAPI.

Choose a capped marketplace plan, copy the generated request, and route the structured result through your own authorized workflow.