# Ics Privacy Scrub — REST API endpoint `ics-privacy-scrub`

Redact an iCalendar (.ics) export before sharing it: per field, keep, generalize or remove the title (SUMMARY), description, location, links (URL, CONFERENCE and vendor meeting links), attendees, organizer, attachments, comments and categories. Defaults keep the schedule and hide the details: titles become "Busy", descriptions, locations, links, attendees, organizer, attachments and comments are removed, categories stay, alarms are removed, every UID is replaced (a recurring series keeps one shared UID), CLASS is set to PRIVATE, and vendor X- properties, CONTACT and RESOURCES are removed. DTSTART, DTEND, DURATION, RRULE, EXDATE, RDATE, RECURRENCE-ID, STATUS and TRANSP are kept, and shift_days can move every date by whole days without touching the TZID. Generalize writes "Private" for text fields, numbered stand-ins such as "Attendee 1 <attendee-1@example.invalid>" for people, and only the scheme and host of a link. Recurrence rules are never expanded and no calendar URL is fetched.

- Category: security
- 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-privacy-scrub/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/api/ics-privacy-scrub/
- Same tool on the other surface: https://findutils.com/mcp/ics-privacy-scrub/

## Call the endpoint (verified example)

```bash
curl -X POST https://api.findutils.com/api/tools/ics-privacy-scrub/execute \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "input": "BEGIN:VCALENDAR\nVERSION:2.0\nBEGIN:VEVENT\nUID:a@example.com\nDTSTART;TZID=Europe/Istanbul:20261006T100000\nDTEND;TZID=Europe/Istanbul:20261006T103000\nSUMMARY:Client Sync with Acme\nDESCRIPTION:Zoom https://zoom.us/j/123\nATTENDEE;CN=Jane:mailto:jane@example.com\nBEGIN:VALARM\nACTION:DISPLAY\nTRIGGER:-PT10M\nDESCRIPTION:Reminder\nEND:VALARM\nEND:VEVENT\nEND:VCALENDAR\n"
  }'

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

## Input schema

| Argument | Type | Required | Description |
|---|---|---|---|
| `input` | string | yes | The .ics file contents. |
| `summary` | string (keep \| generalize \| remove) | no | What to do with SUMMARY: keep, generalize or remove. Default generalize. Default: `"generalize"`. |
| `description` | string (keep \| generalize \| remove) | no | What to do with DESCRIPTION: keep, generalize or remove. Default remove. Default: `"remove"`. |
| `location` | string (keep \| generalize \| remove) | no | What to do with LOCATION: keep, generalize or remove. Default remove. Default: `"remove"`. |
| `url` | string (keep \| generalize \| remove) | no | What to do with URL: keep, generalize or remove. Default remove. Default: `"remove"`. |
| `attendee` | string (keep \| generalize \| remove) | no | What to do with ATTENDEE: keep, generalize or remove. Default remove. Default: `"remove"`. |
| `organizer` | string (keep \| generalize \| remove) | no | What to do with ORGANIZER: keep, generalize or remove. Default remove. Default: `"remove"`. |
| `attach` | string (keep \| generalize \| remove) | no | What to do with ATTACH: keep, generalize or remove. Default remove. Default: `"remove"`. |
| `comment` | string (keep \| generalize \| remove) | no | What to do with COMMENT: keep, generalize or remove. Default remove. Default: `"remove"`. |
| `categories` | string (keep \| generalize \| remove) | no | What to do with CATEGORIES: keep, generalize or remove. Default keep. Default: `"keep"`. |
| `summary_label` | string | no | The title Generalize writes, such as Busy or Blocked. Default Busy. Default: `"Busy"`. |
| `remove_other` | boolean | no | Remove vendor X- properties, CONTACT and RESOURCES from every entry, and the calendar name and description from the header. Default true. Default: `true`. |
| `strip_alarms` | boolean | no | Remove every VALARM. Default true. Default: `true`. |
| `regenerate_uids` | boolean | no | Replace every UID with a random UUID; a recurrence master and its exceptions keep sharing one. Default true, so a re-import never collides with the original calendar. Default: `true`. |
| `mark_private` | boolean | no | Set CLASS:PRIVATE on every entry. Default true. Default: `true`. |
| `shift_days` | integer | no | Move every date by this many whole days (DTSTART, DTEND, DUE, RECURRENCE-ID, EXDATE, RDATE, RRULE UNTIL, absolute alarm triggers), keeping each value's zone. Default 0, at most 3650 either way. Default: `0`. |
| `calendar_name` | string | no | Written as X-WR-CALNAME. Default: none when remove_other is on, else the source name. |

Example arguments (verified):

```json
{
  "input": "BEGIN:VCALENDAR\nVERSION:2.0\nBEGIN:VEVENT\nUID:a@example.com\nDTSTART;TZID=Europe/Istanbul:20261006T100000\nDTEND;TZID=Europe/Istanbul:20261006T103000\nSUMMARY:Client Sync with Acme\nDESCRIPTION:Zoom https://zoom.us/j/123\nATTENDEE;CN=Jane:mailto:jane@example.com\nBEGIN:VALARM\nACTION:DISPLAY\nTRIGGER:-PT10M\nDESCRIPTION:Reminder\nEND:VALARM\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/ --header "Authorization: Bearer YOUR_API_KEY"
```

Then ask the client to call `findutils:ics_privacy_scrub`. Full MCP reference: https://findutils.com/mcp/ics-privacy-scrub/

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