Calendar scheduling agent
Natural language to ICS — an agent that parses scheduling intent from user messages and emits standards-compliant calendar files ready for any client.
Overview
This recipe wires a lightweight scheduling agent that accepts unstructured natural-language input — a Slack message, an email snippet, a voice transcript — and produces a valid .ics file conforming to RFC 5545. The agent extracts dates, times, recurrence rules, attendees, and location, then assembles a VCALENDAR payload with proper VTIMEZONE blocks and VEVENT entries. No external calendar API required; the output is a portable file that works with Google Calendar, Outlook, and Apple Calendar.
How it works
Parse intent
The agent extracts temporal expressions, participant names, and location cues from free-form text using structured prompt engineering.
Resolve & validate
Relative dates like "next Tuesday" are resolved against a reference timestamp. Conflicts and missing fields are flagged.
Emit ICS
A standards-compliant VCALENDAR is generated with proper line folding, UID, DTSTAMP, and VTIMEZONE components.
Example
Input (natural language)
Schedule a 30-minute standup with alice@corp.com and bob@corp.com every weekday at 9:15 AM Pacific starting next Monday.
Output (ICS excerpt)
BEGIN:VCALENDAR VERSION:2.0 PRODID:-//Meridian//Calendar Agent//EN BEGIN:VEVENT DTSTART;TZID=America/Los_Angeles:20260112T091500 DTEND;TZID=America/Los_Angeles:20260112T094500 RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR SUMMARY:Daily Standup ATTENDEE:mailto:alice@corp.com ATTENDEE:mailto:bob@corp.com END:VEVENT END:VCALENDAR
Integration
Deploy the agent behind a Meridian endpoint. POST a JSON body with the message field and receive a base64-encoded ICS payload in the response. Pipe the output directly into an email attachment, a Slack file upload, or a download link. The agent is stateless — every request is self-contained.
POST /api/recipes/calendar-agent
Content-Type: application/json
{
"message": "Lunch with Sarah Friday noon",
"reference_time": "2026-01-14T00:00:00Z"
}