# Merge Ics — REST API endpoint `merge-ics`

Merge several iCalendar (.ics) exports into one calendar file for a single import or archive. Every event, to-do and journal entry is carried in file order under one VCALENDAR; VTIMEZONE blocks are kept once per TZID; RRULE, EXDATE, VALARM, ATTENDEE and every other property are written exactly as read. By default nothing is removed. dedupe_uid keeps one copy per UID (plus RECURRENCE-ID, so a modified occurrence never loses its series), preferring the newest LAST-MODIFIED, then DTSTAMP, then SEQUENCE. regenerate_uids rewrites every UID so a calendar app treats the events as new. An input that is not a calendar is reported and the rest still merge. Recurrence rules are never expanded and no calendar URL is fetched.

- Category: productivity
- MCP server: https://mcp.findutils.com/ (Streamable HTTP, no API keys, 120 req/min per IP)
- REST endpoint: POST https://api.findutils.com/api/tools/merge-ics/execute (no API keys, 60 req/min per IP)
- Reference page: https://findutils.com/api/merge-ics/
- Same tool on the other surface: https://findutils.com/mcp/merge-ics/

## Call the endpoint (verified example)

```bash
curl -X POST https://api.findutils.com/api/tools/merge-ics/execute \
  -H "Content-Type: application/json" \
  -d '{
    "inputs": [
      "BEGIN:VCALENDAR\nVERSION:2.0\nBEGIN:VEVENT\nUID:a@example.com\nDTSTART:20260903T093000Z\nDTEND:20260903T101500Z\nSUMMARY:Standup\nEND:VEVENT\nEND:VCALENDAR\n",
      "BEGIN:VCALENDAR\nVERSION:2.0\nBEGIN:VEVENT\nUID:b@example.com\nDTSTART;VALUE=DATE:20260905\nDTEND;VALUE=DATE:20260906\nSUMMARY:Offsite\nEND:VEVENT\nEND:VCALENDAR\n"
    ]
  }'

# Parameter schema
curl https://api.findutils.com/api/tools/merge-ics
```

## Input schema

| Argument | Type | Required | Description |
|---|---|---|---|
| `inputs` | array | yes | The .ics file contents, one string per file, in the order they should appear. At most 20. |
| `dedupe_uid` | boolean | no | Keep one copy per UID and RECURRENCE-ID, the newest by LAST-MODIFIED, then DTSTAMP, then SEQUENCE. Default false: every copy stays. Default: `false`. |
| `regenerate_uids` | boolean | no | Replace every UID with a new deterministic one. Calendar apps then import the events as new instead of updating existing ones. A recurrence master and its exceptions keep sharing one UID. Default false. Default: `false`. |
| `calendar_name` | string | no | Written as X-WR-CALNAME. Default: the name every input agrees on, else none. |

Example arguments (verified):

```json
{
  "inputs": [
    "BEGIN:VCALENDAR\nVERSION:2.0\nBEGIN:VEVENT\nUID:a@example.com\nDTSTART:20260903T093000Z\nDTEND:20260903T101500Z\nSUMMARY:Standup\nEND:VEVENT\nEND:VCALENDAR\n",
    "BEGIN:VCALENDAR\nVERSION:2.0\nBEGIN:VEVENT\nUID:b@example.com\nDTSTART;VALUE=DATE:20260905\nDTEND;VALUE=DATE:20260906\nSUMMARY:Offsite\nEND:VEVENT\nEND:VCALENDAR\n"
  ]
}
```

OpenAPI 3.1 spec: https://findutils.com/api/openapi.json · Interactive docs: https://findutils.com/api/docs/

## Also an MCP tool

```bash
claude mcp add findutils --transport http https://mcp.findutils.com/
```

Then ask the client to call `findutils:merge_ics`. Full MCP reference: https://findutils.com/mcp/merge-ics/

---
Full catalog: GET https://api.findutils.com/api/tools · https://findutils.com/api/ · https://findutils.com/llms.txt
