Skip to main content

ical CLI

macOS Calendar.app CLI tool — schedule, invite, list, and verify calendar events.

Install

uv tool install --python 3.14 ical-mcp
# or, with Python 3.10 or newer
pip install ical-mcp
# or
brew install ml-lubich/tap/ical

From a checkout:

uv tool install --editable .

The PyPI distribution is named ical-mcp. It installs the ical Typer CLI and the standalone ical-mcp stdio server; ical mcp remains a compatibility alias for the server command.

Usage

ical -h
ical agent -h
ical calendars
ical add --title "Team Sync" --start "Monday, August 10, 2026 at 1:00:00 PM" --end "Monday, August 10, 2026 at 2:00:00 PM" -a guest@example.com -c you@example.com
ical add --title "Team Sync" --start "Monday, August 10, 2026 at 1:00:00 PM" --end "Monday, August 10, 2026 at 2:00:00 PM" -a guest@example.com -c you@example.com --json
ical show --id EVENT_ID --calendar you@example.com --json
ical list -c you@example.com
ical list -c you@example.com -j

Every command and command group accepts both -h and --help; generated shell-completion flags are disabled so help lists the supported command surface. ical list prints a human-readable table; -j/--json prints JSON to stdout. ical add verifies the created event by reading it back from Calendar before reporting success. Human output summarizes the verified event and attendee RSVP status. With --json, it returns a stable object with status: "verified" and an event containing the event ID, title, ISO 8601 start and end, calendar, and attendees (email and status). A post-write verification failure reports status: "created_unverified", along with the event ID and error. unknown RSVP status means Calendar has no recorded response from that attendee yet; it does not mean they accepted. CLI errors are printed to stderr and return a nonzero exit status.

Start and end values accept natural-language dates and ISO 8601. An explicit ISO 8601 UTC offset is converted to the Mac's local calendar time before the event is created; numeric date components avoid AppleScript misreading ISO strings as locale-specific dates.

Every Calendar AppleScript call has a 20-second timeout. Conflict checks ask Calendar for only events that overlap the requested time window, which avoids loading an entire large calendar before an invitation. ical list still reads all events. Calendar failures, timeouts, and failed event lookups are reported as errors; ical list does not turn an automation failure into an empty calendar. If creation times out before Calendar returns an ID, JSON reports status: "write_outcome_unknown" and an error. Search for the event with ical list before retrying. If the conflict check times out before creation starts, JSON reports status: "not_created"; it is safe to retry after Calendar responds. If an ID is available but read-back failed, use ical show --id EVENT_ID --calendar CALENDAR --json to verify it. Do not retry the add until confirming the event is absent, or you may send a duplicate invitation. ical show is read-only and returns the same verified event envelope as ical add. A JSON lookup failure returns status: "verification_failed", the requested event ID, and the error; retry the read after checking Calendar, never the add.

MCP (for AI agents)

ical-mcp is the standalone FastMCP server command for stdio clients. It exposes list_calendars, list_events, and add_calendar_event. The backward-compatible ical mcp command runs the same server. Point any MCP-compatible client (Claude Desktop, Claude Code, etc.) at the standalone executable:

{
  "mcpServers": {
    "ical": {
      "command": "ical-mcp"
    }
  }
}

If ical-mcp isn't on PATH, use its absolute path from uv tool dir --bin. Existing MCP configs using ical with args: ["mcp"] continue to work.

macOS Calendar's AppleScript scripting bridge can be slow for calendars with many recurring events. Calls now stop after the bounded timeout and return an actionable error instead of appearing to hang indefinitely.

Testing

uv run --extra dev pytest

The default test command reports coverage and enforces an 80% minimum. Tests mock only the OS boundary (subprocess/osascript); parsing, conflict detection, CLI dispatch, and MCP tool functions run for real.

Metadata

Release files for ical-mcp 0.2.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ical-mcp 0.2.3
File Size Uploaded Provenance
ical_mcp-0.2.3.tar.gz 10.8 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for ical-mcp 0.2.3
File Interpreter ABI Platform
ical_mcp-0.2.3-py3-none-any.whl Python 3 none any Details

Total release size: 24.1 kB

Release files / ical_mcp-0.2.3.tar.gz

Download URL ical_mcp-0.2.3.tar.gz
Size 10.8 kB
Tags Source
SHA-256 checksum
How to use checksums
021a634fde46a7522c23922de6985f6a144dac53d295de23bc8e4342d0f55ec7
BLAKE2b-256 checksum
How to use checksums
df0c2807e59d0a5d4988011c6ff6161820e5e9a201d805b8ea570848314c857b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / ical_mcp-0.2.3-py3-none-any.whl

Download URL ical_mcp-0.2.3-py3-none-any.whl
Size 13.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
19c0f3b9b6ff84ba3c2d822b1d5bfbc24300e51b0e5a8711ff00e3bd4af2ec91
BLAKE2b-256 checksum
How to use checksums
ab17da9bb092f0c0df9384c1f3229659170f1b4f084b2379190aee584804f717
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Security for ical-mcp 0.2.3

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.2.3 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page