# Ics Busy Free — MCP tool `findutils:ics_busy_free`

Turn a detailed iCalendar (.ics) export into an availability file to share. busy_events mode writes one VEVENT per busy event with SUMMARY "Busy", TRANSP:OPAQUE and CLASS:PRIVATE, keeping only DTSTART, DTEND or DURATION, RRULE, RDATE, EXDATE, RECURRENCE-ID and DTSTAMP, with a new UID (a recurring series keeps one shared UID); descriptions, locations, links, attendees, organizer, alarms and vendor properties are left behind. vfreebusy mode writes one VFREEBUSY with a FREEBUSY period in UTC per busy event, overlapping periods joined; a recurring event is listed by its first occurrence only, because recurrence rules are never expanded. Cancelled events (drop_cancelled) and events marked free (TRANSP:TRANSPARENT) are skipped; a skipped modified occurrence becomes an EXDATE on its series so it is not busy either. Tentative events are included unless include_tentative is false. 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-busy-free/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-busy-free/
- Same tool on the other surface: https://findutils.com/api/ics-busy-free/

## 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_busy_free",
      "arguments": {
        "input": "BEGIN:VCALENDAR\nVERSION:2.0\nBEGIN:VEVENT\nUID:a@example.com\nDTSTART:20261006T110000Z\nDTEND:20261006T120000Z\nSUMMARY:Contract review with Acme\nDESCRIPTION:Zoom https://zoom.us/j/987\nEND:VEVENT\nBEGIN:VEVENT\nUID:b@example.com\nDTSTART:20261007T090000Z\nDTEND:20261007T100000Z\nSTATUS:CANCELLED\nSUMMARY:Old kickoff\nEND:VEVENT\nEND:VCALENDAR\n",
        "mode": "vfreebusy"
      }
    }
  }'
```

## Input schema

| Argument | Type | Required | Description |
|---|---|---|---|
| `input` | string | yes | The .ics file contents. |
| `mode` | string (busy_events \| vfreebusy) | no | busy_events (default): Busy VEVENTs that keep recurrence rules. vfreebusy: one VFREEBUSY with FREEBUSY periods in UTC. Default: `"busy_events"`. |
| `include_tentative` | boolean | no | Count STATUS:TENTATIVE events as busy (FBTYPE=BUSY-TENTATIVE in vfreebusy mode). Default true. Default: `true`. |
| `drop_cancelled` | boolean | no | Skip STATUS:CANCELLED events. Default true. Default: `true`. |
| `calendar_name` | string | no | Written as X-WR-CALNAME. Default none: the source calendar name is not copied, since it often names a person. |
| `label` | string | no | The SUMMARY of every busy block in busy_events mode. Default Busy. Default: `"Busy"`. |

Example arguments (verified):

```json
{
  "input": "BEGIN:VCALENDAR\nVERSION:2.0\nBEGIN:VEVENT\nUID:a@example.com\nDTSTART:20261006T110000Z\nDTEND:20261006T120000Z\nSUMMARY:Contract review with Acme\nDESCRIPTION:Zoom https://zoom.us/j/987\nEND:VEVENT\nBEGIN:VEVENT\nUID:b@example.com\nDTSTART:20261007T090000Z\nDTEND:20261007T100000Z\nSTATUS:CANCELLED\nSUMMARY:Old kickoff\nEND:VEVENT\nEND:VCALENDAR\n",
  "mode": "vfreebusy"
}
```

## Also a REST endpoint

```bash
curl -X POST https://api.findutils.com/api/tools/ics-busy-free/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:20261006T110000Z\nDTEND:20261006T120000Z\nSUMMARY:Contract review with Acme\nDESCRIPTION:Zoom https://zoom.us/j/987\nEND:VEVENT\nBEGIN:VEVENT\nUID:b@example.com\nDTSTART:20261007T090000Z\nDTEND:20261007T100000Z\nSTATUS:CANCELLED\nSUMMARY:Old kickoff\nEND:VEVENT\nEND:VCALENDAR\n",
    "mode": "vfreebusy"
  }'

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

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