# Ics Filter — MCP tool `findutils:ics_filter`

Filter an iCalendar (.ics) file down to the entries you want and get a smaller calendar to import, plus the removed entries as their own calendar. Filters, all optional and combined with AND: a date range (from and to, YYYY-MM-DD, inclusive, compared with each entry's own wall-clock time), a keyword (case-insensitive, in SUMMARY, DESCRIPTION or LOCATION), a category (one of a comma-separated list, matched against CATEGORIES), a STATUS, and drop_cancelled (default true). A recurring series is kept or removed whole, judged by its main event: the date range keeps it when at least one occurrence (RRULE, RDATE, less EXDATE) or one modified occurrence falls in the range. The rule is not expanded in the output, and a modified or cancelled occurrence stays with its series. VTIMEZONE blocks are kept for the entries that use them. Every property is copied as read.

- Category: seo
- 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-filter/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-filter/
- Same tool on the other surface: https://findutils.com/api/ics-filter/

## 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_filter",
      "arguments": {
        "input": "BEGIN:VCALENDAR\nVERSION:2.0\nBEGIN:VEVENT\nUID:standup@example.com\nDTSTART:20261005T063000Z\nRRULE:FREQ=WEEKLY;BYDAY=MO\nSUMMARY:Standup\nEND:VEVENT\nBEGIN:VEVENT\nUID:lunch@example.com\nDTSTART:20261007T100000Z\nSUMMARY:Team lunch\nSTATUS:CANCELLED\nEND:VEVENT\nBEGIN:VEVENT\nUID:dentist@example.com\nDTSTART;VALUE=DATE:20260905\nSUMMARY:Dentist\nEND:VEVENT\nEND:VCALENDAR\n",
        "from": "2026-10-01",
        "to": "2026-12-31",
        "keyword": "standup"
      }
    }
  }'
```

## Input schema

| Argument | Type | Required | Description |
|---|---|---|---|
| `input` | string | yes | The .ics file contents. |
| `from` | string | no | Keep entries that end on or after this day, YYYY-MM-DD. Optional. |
| `to` | string | no | Keep entries that start on or before this day, YYYY-MM-DD. Optional. |
| `keyword` | string | no | Keep entries whose SUMMARY, DESCRIPTION or LOCATION contains this text, ignoring case. Optional. |
| `category` | string | no | Keep entries with one of these CATEGORIES (comma-separated, ignoring case). Optional. |
| `status` | string (any \| confirmed \| tentative \| cancelled) | no | Keep entries with this STATUS only; an entry without a STATUS line matches only "any". Default any. Default: `"any"`. |
| `drop_cancelled` | boolean | no | Remove entries with STATUS:CANCELLED. Default true. Ignored when status is "cancelled". Default: `true`. |

Example arguments (verified):

```json
{
  "input": "BEGIN:VCALENDAR\nVERSION:2.0\nBEGIN:VEVENT\nUID:standup@example.com\nDTSTART:20261005T063000Z\nRRULE:FREQ=WEEKLY;BYDAY=MO\nSUMMARY:Standup\nEND:VEVENT\nBEGIN:VEVENT\nUID:lunch@example.com\nDTSTART:20261007T100000Z\nSUMMARY:Team lunch\nSTATUS:CANCELLED\nEND:VEVENT\nBEGIN:VEVENT\nUID:dentist@example.com\nDTSTART;VALUE=DATE:20260905\nSUMMARY:Dentist\nEND:VEVENT\nEND:VCALENDAR\n",
  "from": "2026-10-01",
  "to": "2026-12-31",
  "keyword": "standup"
}
```

## Also a REST endpoint

```bash
curl -X POST https://api.findutils.com/api/tools/ics-filter/execute \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "input": "BEGIN:VCALENDAR\nVERSION:2.0\nBEGIN:VEVENT\nUID:standup@example.com\nDTSTART:20261005T063000Z\nRRULE:FREQ=WEEKLY;BYDAY=MO\nSUMMARY:Standup\nEND:VEVENT\nBEGIN:VEVENT\nUID:lunch@example.com\nDTSTART:20261007T100000Z\nSUMMARY:Team lunch\nSTATUS:CANCELLED\nEND:VEVENT\nBEGIN:VEVENT\nUID:dentist@example.com\nDTSTART;VALUE=DATE:20260905\nSUMMARY:Dentist\nEND:VEVENT\nEND:VCALENDAR\n",
    "from": "2026-10-01",
    "to": "2026-12-31",
    "keyword": "standup"
  }'

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

Full REST reference: https://findutils.com/api/ics-filter/ · 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
