Skip to main content

webcal-mcp

A small read-only Model Context Protocol server that exposes one or more remote iCalendar feeds (the webcal:// or .ics kind) as queryable tools for an LLM agent.

Install

pipx install webcal-mcp

Or from a checkout:

pipx install .

This puts a webcal-mcp script on your PATH. Python 3.10 or later is required.

Configure

Create ~/.config/webcal-mcp/config.toml (or point WEBCAL_MCP_CONFIG at any other path). See config.example.toml:

default_ttl_seconds = 900

[calendars.personal]
url = "webcal://example.com/personal.ics"
description = "Personal calendar"

[calendars.work]
url = "https://example.com/work.ics"
description = "Work calendar"

webcal:// and webcals:// URLs are normalized to https://.

Local calendars via EventKit (macOS)

On macOS, any calendar already set up in Calendar.app — iCloud, local, subscribed .ics, CalDAV, Google — can be read directly through Apple's EventKit framework. No webcal:// URL hunting required:

[calendars.personal]
source = "eventkit"
identifier = "Personal"   # display name from Calendar.app, or its UUID
description = "iCloud personal calendar"

identifier matches the calendar's display name first, then falls back to its UUID. Run webcal-mcp list-eventkit to see what's available (this dumps title uuid [source] for every calendar).

First use triggers a one-time TCC prompt for Calendar access; the grant is bound to the binary that invokes EventKit (the Python interpreter behind webcal-mcp), so re-granting may be needed if you reinstall. The PyObjC dependency installs automatically on macOS only.

Run

webcal-mcp

The server speaks MCP over stdio. Wire it into an MCP-aware client (Claude Desktop, Claude Code, etc.) by pointing at the webcal-mcp script. For example, for Claude Code:

claude mcp add webcal -- webcal-mcp

Tools

Tool Purpose
list_calendars Names, descriptions, capability flags for the configured calendars. Re-reads the config file, so calendars added or changed since startup appear without restarting the server.
list_events Events in a date range, with optional query, categories, location filters and brief / full / markdown detail modes. Either bound may be omitted for open-ended windows.
events_on All events occurring on a given date.
get_event Full record for a single UID.

list_events and events_on accept calendar as a single name, a list of names, or omitted — omitting it queries all configured calendars. When more than one calendar is queried, each event is tagged with its source calendar and results are merged and sorted by start time; an unreachable calendar is skipped (best-effort) rather than failing the whole request.

Recurring events are expanded within the requested window. Responses are cached in memory with a per-calendar TTL; revalidation uses HTTP ETag and Last-Modified.

Read-only

Calendars are read-only today. The CalendarSource abstraction reserves a writable capability flag so future write-capable backends can be added without changing the tool surface.

Metadata

Release files for webcal-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 webcal-mcp 0.2.3
File Size Uploaded Provenance Actions
webcal_mcp-0.2.3.tar.gz 25.3 kB With provenance Details for webcal_mcp-0.2.3.tar.gz

Built distribution (wheel)

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

Total release size: 46.2 kB

Release files / webcal_mcp-0.2.3.tar.gz

Download URL webcal_mcp-0.2.3.tar.gz
Size 25.3 kB
Tags Source
SHA-256 checksum
How to use checksums
98a53867cb008309cc538555bdd5805990abfa357dfe13c9c2f399ce267b1bba
BLAKE2b-256 checksum
How to use checksums
98bbd8d7b48ab75218b12faf0d14de21137a8fea872203358de63998c4556588
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

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.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 11, 2026.

Transparency log

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

Download URL webcal_mcp-0.2.3-py3-none-any.whl
Size 20.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e0b30f477ea1a11f9e924252917c0754ae5fd2d7b27accc7e3b9121792a1a91a
BLAKE2b-256 checksum
How to use checksums
7f51e261b77b0c1008554d1c793acf6d4a50f92590ba388d00cb825caaecd886
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

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.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 11, 2026.

Transparency log

Security for webcal-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.

Full provenance

Both files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for webcal_mcp-0.2.3.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 11, 2026.

Transparency log

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.

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