# Ics Diff — MCP tool `findutils:ics_diff`

Compare two iCalendar (.ics) exports of the same calendar, before and after, and report which events were added, removed or changed. Entries are matched by UID plus RECURRENCE-ID (a modified occurrence is its own entry), never by position or title; entries without a UID are listed and never matched. A changed entry lists each field that differs with its before and after values; repeated fields such as ATTENDEE or CATEGORIES show only the values that differ, and an alarm (VALARM) counts as a field. Property order, line folding and parameter order are not differences. DTSTAMP, LAST-MODIFIED and SEQUENCE are ignored by default because calendar apps rewrite them on every export. Times are compared as written, never converted between zones. Also returns the added and the removed entries as calendars of their own. No calendar URL is fetched.

- Category: productivity
- MCP server: https://mcp.findutils.com/ (Streamable HTTP, API key for tools/call, 120 req/min per IP)
- REST endpoint: POST https://api.findutils.com/api/tools/ics-diff/execute (API key, 60 req/min per IP)
- API key: Running a tool needs an API key. Keys are not for sale yet: ask for early access. Without a key, a tool call answers HTTP 402 Payment Required with the error code PAYMENT_REQUIRED. The catalog and the schemas stay open without a key. https://findutils.com/api/#api-keys
- Reference page: https://findutils.com/mcp/ics-diff/
- Same tool on the other surface: https://findutils.com/api/ics-diff/

## Connect

```bash
claude mcp add findutils --transport http https://mcp.findutils.com/ --header "Authorization: Bearer YOUR_API_KEY"
```

Claude Desktop (`claude_desktop_config.json`):

```json
{
  "mcpServers": {
    "findutils": {
      "url": "https://mcp.findutils.com/",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}
```

## Call the tool (verified example)

```bash
curl -X POST https://mcp.findutils.com/ \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "ics_diff",
      "arguments": {
        "before": "BEGIN:VCALENDAR\nVERSION:2.0\nBEGIN:VEVENT\nUID:standup@example.com\nDTSTART:20261005T063000Z\nSUMMARY:Standup\nLOCATION:Room 4\nEND:VEVENT\nBEGIN:VEVENT\nUID:dentist@example.com\nDTSTART;VALUE=DATE:20261009\nSUMMARY:Dentist\nEND:VEVENT\nEND:VCALENDAR\n",
        "after": "BEGIN:VCALENDAR\nVERSION:2.0\nBEGIN:VEVENT\nUID:standup@example.com\nDTSTART:20261005T070000Z\nSUMMARY:Standup\nLOCATION:Room 7\nEND:VEVENT\nBEGIN:VEVENT\nUID:offsite@example.com\nDTSTART;VALUE=DATE:20261012\nSUMMARY:Offsite\nEND:VEVENT\nEND:VCALENDAR\n"
      }
    }
  }'
```

## Input schema

| Argument | Type | Required | Description |
|---|---|---|---|
| `before` | string | yes | The earlier .ics export (A). |
| `after` | string | yes | The later .ics export (B). |
| `ignore_metadata` | boolean | no | Leave DTSTAMP, LAST-MODIFIED and SEQUENCE out of the comparison. Default true. Default: `true`. |
| `include_todos` | boolean | no | Also compare VTODO and VJOURNAL entries. Default false: events only. Default: `false`. |

Example arguments (verified):

```json
{
  "before": "BEGIN:VCALENDAR\nVERSION:2.0\nBEGIN:VEVENT\nUID:standup@example.com\nDTSTART:20261005T063000Z\nSUMMARY:Standup\nLOCATION:Room 4\nEND:VEVENT\nBEGIN:VEVENT\nUID:dentist@example.com\nDTSTART;VALUE=DATE:20261009\nSUMMARY:Dentist\nEND:VEVENT\nEND:VCALENDAR\n",
  "after": "BEGIN:VCALENDAR\nVERSION:2.0\nBEGIN:VEVENT\nUID:standup@example.com\nDTSTART:20261005T070000Z\nSUMMARY:Standup\nLOCATION:Room 7\nEND:VEVENT\nBEGIN:VEVENT\nUID:offsite@example.com\nDTSTART;VALUE=DATE:20261012\nSUMMARY:Offsite\nEND:VEVENT\nEND:VCALENDAR\n"
}
```

## Also a REST endpoint

```bash
curl -X POST https://api.findutils.com/api/tools/ics-diff/execute \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "before": "BEGIN:VCALENDAR\nVERSION:2.0\nBEGIN:VEVENT\nUID:standup@example.com\nDTSTART:20261005T063000Z\nSUMMARY:Standup\nLOCATION:Room 4\nEND:VEVENT\nBEGIN:VEVENT\nUID:dentist@example.com\nDTSTART;VALUE=DATE:20261009\nSUMMARY:Dentist\nEND:VEVENT\nEND:VCALENDAR\n",
    "after": "BEGIN:VCALENDAR\nVERSION:2.0\nBEGIN:VEVENT\nUID:standup@example.com\nDTSTART:20261005T070000Z\nSUMMARY:Standup\nLOCATION:Room 7\nEND:VEVENT\nBEGIN:VEVENT\nUID:offsite@example.com\nDTSTART;VALUE=DATE:20261012\nSUMMARY:Offsite\nEND:VEVENT\nEND:VCALENDAR\n"
  }'

# Parameter schema (no key needed)
curl https://api.findutils.com/api/tools/ics-diff
```

Full REST reference: https://findutils.com/api/ics-diff/ · OpenAPI 3.1 spec: https://findutils.com/api/openapi.json

---
Full catalog: POST https://mcp.findutils.com/ with method `tools/list` · https://findutils.com/mcp/ · https://findutils.com/llms.txt
