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.

Every Calendar AppleScript call has a 20-second timeout. 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.2

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.2
File Size Uploaded Provenance
ical_mcp-0.2.2.tar.gz 10.2 kB Without provenance Details

Built distribution (wheel)

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

Total release size: 22.9 kB

Release files / ical_mcp-0.2.2.tar.gz

Download URL ical_mcp-0.2.2.tar.gz
Size 10.2 kB
Tags Source
SHA-256 checksum
How to use checksums
ff97ae13b4407cfc8d106a49175c300812e4ae32fe8ad2eabb84b94682a2ccbb
BLAKE2b-256 checksum
How to use checksums
5e96a05232ef13fc67faca1b77de4d94dfc6a83931064e648431b91bce345360
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.2-py3-none-any.whl

Download URL ical_mcp-0.2.2-py3-none-any.whl
Size 12.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
444c0bdb5f258c4e6c2ed773c66c717f42f4fbe5b6423261f8a7995e89f26d7c
BLAKE2b-256 checksum
How to use checksums
7899879d5d6d9b89afa8a2c5c816241648b5f288fdbaa6e4345a08dd102065e2
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.2

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.2 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