[Agent Tools](https://tools.openkrill.app/) / [Blog](https://tools.openkrill.app/blog)

# How to create RFC 5545 .ics calendar invites, Google Calendar links and .eml email drafts in an AI agent

On 2026-10-20, calling `create_calendar_event` on [Send Out](https://tools.openkrill.app/tools/send-out) built an RFC 5545 `.ics` file (with a `Europe/Paris` `VTIMEZONE` block) and a 158-character Google Calendar template URL for a 45-minute "Sprint Review" on `2026-11-02` at `15:00` Paris time (`14:00` to `14:45` UTC) in 814 ms, compared with 60,000 ms of manual form clicks on iCal Event Maker and 5,314 ms writing a script with the `ics` npm library. A second call to `draft_email` generated a 289-character RFC 6068 `mailto:` link and an RFC 822 `.eml` email draft with `X-Unsent: 1` in 396 ms.

Giving an AI agent OAuth write access to your Google Calendar or Gmail account means one hallucinated recipient or date immediately sends an invite or email to real people. The [Send Out MCP server](https://tools.openkrill.app/tools/send-out) (`https://sendout.openkrill.app/mcp`) keeps the human in the loop: it needs no account or OAuth token, sends nothing itself, and returns ready-to-open links and standard files that you review and save in your own calendar, email, WhatsApp, Obsidian or X client.

## 1. Build an RFC 5545 .ics calendar invite and Google Calendar link in one call

When scheduling an event across time zones, two details frequently break in hand-written LLM output: daylight-saving transitions (European summer time ends on `2026-10-25`, so Paris is UTC+1 CET on `2026-11-02`) and the CRLF (`\r\n`) line endings required by RFC 5545 section 3.1.

Here is the exact JSON-RPC call from our saved 2026-10-20 ranking run for a 45-minute "Sprint Review" in Room 4B on `2026-11-02` at `15:00` `Europe/Paris`:

```
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "create_calendar_event",
    "arguments": {
      "title": "Sprint Review",
      "start": "2026-11-02T15:00",
      "timezone": "Europe/Paris",
      "duration_minutes": 45,
      "location": "Room 4B"
    }
  }
}
```

In 814 ms, `create_calendar_event` returned both the pre-filled Google Calendar web intent URL (with `dates=20261102T140000Z/20261102T144500Z` and `ctz=Europe%2FParis`) and the complete `sprint-review.ics` file:

```
{
  "status": "ok",
  "google_calendar_url": "https://calendar.google.com/calendar/render?action=TEMPLATE&text=Sprint%20Review&dates=20261102T140000Z/20261102T144500Z&location=Room%204B&ctz=Europe%2FParis",
  "filename": "sprint-review.ics",
  "url_length": 158,
  "warning": null,
  "ics_content": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//OpenKrill//SendOut//EN\r\nCALSCALE:GREGORIAN\r\nBEGIN:VTIMEZONE\r\nTZID:Europe/Paris\r\nBEGIN:STANDARD\r\nDTSTART:19700101T000000\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0100\r\nTZNAME:+0100\r\nEND:STANDARD\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nUID:20261020T060643Z-1f7a81cd5cb6@openkrill.app\r\nDTSTAMP:20261020T060643Z\r\nDTSTART;TZID=Europe/Paris:20261102T150000\r\nDTEND;TZID=Europe/Paris:20261102T154500\r\nSUMMARY:Sprint Review\r\nLOCATION:Room 4B\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"
}
```

## 2. Draft an email with a mailto link and an X-Unsent .eml file

The `draft_email` tool accepts `body` (required, up to 50,000 characters) and optional `to`, `cc`, `bcc`, `subject` and `filename`. Here is the saved 2026-10-20 call drafting follow-up notes for the Sprint Review:

```
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "draft_email",
    "arguments": {
      "to": "team@example.com",
      "subject": "Sprint Review Notes - 2026-11-02",
      "body": "Here are the action items from our Sprint Review in Room 4B:\n1. Ship the Q4 onboarding fix by Thursday.\n2. Confirm EU VAT check logs.",
      "cc": "pm@example.com",
      "filename": "sprint-review-notes.eml"
    }
  }
}
```

In 396 ms, `draft_email` returned a 289-character `mailto_url` (`character_count: 133`, `warning: null`) and an RFC 822 / 5322 `.eml` file containing the `X-Unsent: 1` header:

```
To: team@example.com
Cc: pm@example.com
Subject: Sprint Review Notes - 2026-11-02
Date: Tue, 20 Oct 2026 10:23:49 GMT
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
X-Unsent: 1

Here are the action items from our Sprint Review in Room 4B:
1. Ship the Q4 onboarding fix by Thursday.
2. Confirm EU VAT check logs.
```

Because `X-Unsent: 1` is set, opening `sprint-review-notes.eml` in Apple Mail, Microsoft Outlook or Mozilla Thunderbird launches an editable compose window rather than a read-only received message. If the encoded `mailto:` URL exceeds 2,000 characters, `warning` flags the length limit so the agent hands the user the `.eml` file instead.

## 3. All 6 tools on the Send Out MCP server

Calling `tools/list` on `https://sendout.openkrill.app/mcp` exposes 6 tools:

- `create_calendar_event`: RFC 5545 `.ics` calendar invite and Google Calendar template URL for timed or all-day events, with optional `reminder_minutes` (`VALARM`).
- `draft_email`: RFC 6068 `mailto:` link and RFC 822 `.eml` draft with `X-Unsent: 1`.
- `create_whatsapp_link`: official `wa.me` click-to-chat deep link with normalized phone digits and message length check (up to 4,096 characters).
- `create_obsidian_note`: `obsidian://new` deep link plus full Markdown text with YAML frontmatter and tags.
- `create_x_post`: `x.com/intent/tweet` share link with X's 23-character URL weighting and `is_within_free_limit` check (280 characters).
- `create_markdown_file`: standalone Markdown (`.md`) document with YAML frontmatter, byte count, word count and line count.
- `prepare_transfer`: optional temporary hosted download link (1 to 168 hours TTL, SHA-256 checksum) when a user explicitly asks for a hosted file download URL.

## 4. How Send Out compares with iCal Event Maker, the ics npm library and Google Calendar

On 2026-10-20 we compared [Send Out](https://tools.openkrill.app/tools/send-out) against three ways of creating the same 45-minute `Europe/Paris` Sprint Review event:

| Tool | Wall time | Outputs returned | Trade-offs |
| --- | --- | --- | --- |
| **OpenKrill Send Out** (`create_calendar_event`) | 814 ms | RFC 5545 `.ics` file (`Europe/Paris` `VTIMEZONE`) + 158-char Google Calendar link | One keyless MCP call; also drafts emails, WhatsApp links, Obsidian notes and X posts |
| **iCal Event Maker** (`ical.marudot.com`) | 60,000 ms | Downloadable `.ics` file with full `Europe/Paris` `VTIMEZONE` | Browser form requiring ~12 manual clicks; no Google Calendar link, no email draft and no API |
| **`ics` npm library** (`github.com/adamgibbons/ics`) | 5,314 ms | Valid `.ics` string (`DTSTART:20261102T140000Z`, `DURATION:PT45M`) | Requires writing Node.js code and converting `Europe/Paris` to UTC by hand; no Google Calendar link |
| **Google Calendar web app** (`calendar.google.com`) | Not run | Blocked without Google login | Requires signing in to a Google account to create and export an event |

## 5. Connect Send Out in Claude Desktop, Cursor or any MCP client

```
{
  "mcpServers": {
    "send-out": {
      "type": "streamable-http",
      "url": "https://sendout.openkrill.app/mcp"
    }
  }
}
```

## Frequently asked questions

### How can I create an .ics calendar file and a Google Calendar link for a 45-minute meeting in Europe/Paris?

Call `create_calendar_event` on `https://sendout.openkrill.app/mcp` with `title` (`"Sprint Review"`), `start` (`"2026-11-02T15:00"`), `timezone` (`"Europe/Paris"`), `duration_minutes` (`45`) and `location` (`"Room 4B"`). In one call, the server converts 15:00 CET to 14:00 UTC for the Google Calendar template link and returns CRLF-delimited RFC 5545 `.ics` text with a `Europe/Paris` `VTIMEZONE` block.

### How do I create a pre-filled mailto link and an RFC 822 .eml email draft without giving an AI agent access to my inbox?

Call `draft_email` on `sendout.openkrill.app/mcp` with `body` and optional `to`, `cc`, `bcc`, `subject` and `filename`. Nothing is sent or stored; the tool returns an RFC 6068 `mailto:` URI and a downloadable `.eml` draft containing `X-Unsent: 1` so Apple Mail, Outlook or Thunderbird opens the message in compose mode for you to review and send.

### What happens if an email body or note makes a mailto or Obsidian link longer than 2,000 characters?

Many mail and desktop clients truncate or reject URIs over 2,000 characters. When `url_length` exceeds safe client limits, `draft_email` and `create_obsidian_note` set a `warning` message and advise passing the full `.eml` or Markdown text to the user instead.

### What other handoff artifacts can Send Out generate besides calendar events and emails?

The MCP server at `https://sendout.openkrill.app/mcp` provides 6 tools with no API key (up to 60 calls a minute per network): `create_calendar_event`, `draft_email`, `create_whatsapp_link` (`wa.me` click-to-chat links), `create_obsidian_note` (`obsidian://new` links plus YAML-frontmatter Markdown), `create_x_post` (`x.com` share links with 280-character checks) and `create_markdown_file` (standalone `.md` files), plus `prepare_transfer` for temporary hosted file downloads.

## Sources

- [IETF RFC 5545: Internet Calendaring and Scheduling Core Object Specification (iCalendar)](https://datatracker.ietf.org/doc/html/rfc5545)
- [IETF RFC 6068: The 'mailto' URI Scheme](https://datatracker.ietf.org/doc/html/rfc6068)
- [IETF RFC 5322: Internet Message Format](https://datatracker.ietf.org/doc/html/rfc5322)
- [OpenKrill Send Out MCP Server Documentation](https://tools.openkrill.app/tools/send-out)
