<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: MadboneZ</title>
    <description>The latest articles on DEV Community by MadboneZ (@madbonez).</description>
    <link>https://dev.to/madbonez</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3706075%2F3bc25299-63bd-435b-a901-baa903c3930d.png</url>
      <title>DEV Community: MadboneZ</title>
      <link>https://dev.to/madbonez</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/madbonez"/>
    <language>en</language>
    <item>
      <title>Give Your AI Real Calendar Superpowers with `mcp-caldav`</title>
      <dc:creator>MadboneZ</dc:creator>
      <pubDate>Wed, 14 Jan 2026 09:04:08 +0000</pubDate>
      <link>https://dev.to/madbonez/give-your-ai-real-calendar-superpowers-with-mcp-caldav-5h69</link>
      <guid>https://dev.to/madbonez/give-your-ai-real-calendar-superpowers-with-mcp-caldav-5h69</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/madbonez/caldav-mcp" rel="noopener noreferrer"&gt;https://github.com/madbonez/caldav-mcp&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lately I’ve been playing a lot with the &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt; and one thing quickly became obvious:&lt;br&gt;&lt;br&gt;
it’s cool that an AI can call tools, but it’s a lot cooler when those tools are connected to your &lt;strong&gt;real life&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For me, that started with a simple question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Can I let my AI actually see and manage my calendar?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That’s exactly what &lt;a href="https://github.com/madbonez/caldav-mcp" rel="noopener noreferrer"&gt;&lt;code&gt;mcp-caldav&lt;/code&gt;&lt;/a&gt; does. It’s an MCP server that connects any &lt;strong&gt;CalDAV-compatible calendar&lt;/strong&gt; (Nextcloud, iCloud, FastMail, Yandex, etc.) to your AI tools, so your model can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;List your calendars&lt;/li&gt;
&lt;li&gt;Read your schedule&lt;/li&gt;
&lt;li&gt;Create events with reminders, attendees, and recurrence&lt;/li&gt;
&lt;li&gt;Search or delete events by UID&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project has already made it into the popular &lt;a href="https://github.com/punkpeye/awesome-mcp-servers" rel="noopener noreferrer"&gt;&lt;code&gt;awesome-mcp-servers&lt;/code&gt;&lt;/a&gt; list, which is a nice signal that it’s not just a toy.&lt;/p&gt;

&lt;p&gt;In this post I’ll walk through what the project does, how it’s structured, and how you can plug it into your workflow.&lt;/p&gt;


&lt;h3&gt;
  
  
  Why CalDAV + MCP Is Actually Useful
&lt;/h3&gt;

&lt;p&gt;CalDAV is a standard protocol that a bunch of calendar providers support:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nextcloud / ownCloud&lt;/li&gt;
&lt;li&gt;Apple iCloud&lt;/li&gt;
&lt;li&gt;FastMail&lt;/li&gt;
&lt;li&gt;Yandex Calendar&lt;/li&gt;
&lt;li&gt;Google Calendar (via CalDAV + OAuth)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On the other side, MCP gives LLMs a unified way to call external tools.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mcp-caldav&lt;/code&gt; sits right in the middle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Towards CalDAV&lt;/strong&gt; – it speaks the calendar language: events, UIDs, RRULEs, attendees, reminders, categories, priorities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Towards MCP&lt;/strong&gt; – it exposes a clean set of tools the AI can call to list calendars, create events, fetch events, search, and delete.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s enough to enable workflows like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“What’s on my calendar this week?”&lt;/li&gt;
&lt;li&gt;“Create a 30 minute meeting with Alex tomorrow afternoon.”&lt;/li&gt;
&lt;li&gt;“Show me all events tagged &lt;code&gt;#deep-work&lt;/code&gt; next month.”&lt;/li&gt;
&lt;li&gt;“Delete that ‘Test meeting’ we just created.”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nothing magical, just solid plumbing between your calendar and your AI.&lt;/p&gt;


&lt;h3&gt;
  
  
  Quick Project Overview
&lt;/h3&gt;

&lt;p&gt;The repo is here again for convenience:&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/madbonez/caldav-mcp" rel="noopener noreferrer"&gt;&lt;code&gt;madbonez/caldav-mcp&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The structure is intentionally simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;src/mcp_caldav/&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;__init__.py&lt;/code&gt; – main entry point / CLI&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;server.py&lt;/code&gt; – MCP server implementation (tools, protocol wiring)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;client.py&lt;/code&gt; – CalDAV client wrapper (auth, HTTP, event (de)serialization)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tests/&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;test_server.py&lt;/code&gt;, &lt;code&gt;test_client.py&lt;/code&gt; – unit tests&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;e2e/&lt;/code&gt; – end-to-end tests against a real CalDAV server&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pyproject.toml&lt;/code&gt; – packaging and dependency config&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Makefile&lt;/code&gt; – dev commands (&lt;code&gt;make test&lt;/code&gt;, &lt;code&gt;make check&lt;/code&gt;, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;README.md&lt;/code&gt;, &lt;code&gt;USAGE.md&lt;/code&gt;, &lt;code&gt;QUICKSTART.md&lt;/code&gt; – docs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As a mid-level dev, this is exactly the kind of layout I like: clear entry point, separation between server and client, and a test suite that actually runs.&lt;/p&gt;

&lt;p&gt;Under the hood, the project focuses on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Strict typing&lt;/strong&gt; – &lt;code&gt;mypy&lt;/code&gt; with pretty strict rules&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast linting/formatting&lt;/strong&gt; – &lt;code&gt;ruff&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pre-commit hooks&lt;/strong&gt; – to keep style and checks consistent&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  Getting &lt;code&gt;mcp-caldav&lt;/code&gt; Running
&lt;/h3&gt;

&lt;p&gt;The project uses &lt;a href="https://github.com/astral-sh/uv" rel="noopener noreferrer"&gt;&lt;code&gt;uv&lt;/code&gt;&lt;/a&gt; for dependency management, but you’re not locked into it.&lt;/p&gt;
&lt;h4&gt;
  
  
  Option 1: Local dev with &lt;code&gt;uv&lt;/code&gt; (recommended for hacking)
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/madbonez/caldav-mcp.git
&lt;span class="nb"&gt;cd &lt;/span&gt;caldav-mcp

uv &lt;span class="nb"&gt;sync&lt;/span&gt; &lt;span class="nt"&gt;--dev&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a &lt;code&gt;.venv&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Install runtime + dev dependencies&lt;/li&gt;
&lt;li&gt;Generate &lt;code&gt;uv.lock&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then you can run the server with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv run mcp-caldav
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Option 2: Run via &lt;code&gt;uvx&lt;/code&gt; (no local install)
&lt;/h4&gt;

&lt;p&gt;If you mainly want to &lt;em&gt;use&lt;/em&gt; the server instead of hacking on it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uvx mcp-caldav
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;uvx&lt;/code&gt; will pull the published package and run it directly.&lt;/p&gt;

&lt;h4&gt;
  
  
  Option 3: Classic &lt;code&gt;pip&lt;/code&gt; install
&lt;/h4&gt;

&lt;p&gt;If you’re more comfortable with &lt;code&gt;pip&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
mcp-caldav
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nothing fancy here — just a normal Python CLI entry point.&lt;/p&gt;




&lt;h3&gt;
  
  
  Wiring Up Your Calendar (CalDAV Config)
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;mcp-caldav&lt;/code&gt; reads configuration from environment variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;CALDAV_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://caldav.example.com/"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;CALDAV_USERNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your-username"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;CALDAV_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your-password"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Some common endpoints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Yandex Calendar&lt;/strong&gt;: &lt;code&gt;https://caldav.yandex.ru/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Calendar&lt;/strong&gt;: &lt;code&gt;https://apidata.googleusercontent.com/caldav/v2/&lt;/code&gt; (requires OAuth)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nextcloud&lt;/strong&gt;: &lt;code&gt;https://your-domain.com/remote.php/dav/calendars/username/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ownCloud&lt;/strong&gt;: &lt;code&gt;https://your-domain.com/remote.php/dav/calendars/username/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apple iCloud&lt;/strong&gt;: &lt;code&gt;https://caldav.icloud.com/&lt;/code&gt; (usually with an app-specific password)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FastMail&lt;/strong&gt;: &lt;code&gt;https://caldav.fastmail.com/dav/calendars/user/&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One thing worth calling out: &lt;strong&gt;Yandex rate limits pretty aggressively&lt;/strong&gt; — about 60 seconds per MB since 2021. If you’re doing a lot of write operations (create/update/delete), you can hit 504 timeouts. For heavier workloads, Nextcloud or Google tends to behave better. There are more details in &lt;code&gt;PROVIDER_NOTES.md&lt;/code&gt; in the repo.&lt;/p&gt;




&lt;h3&gt;
  
  
  Plugging It into Cursor (or Another MCP Client)
&lt;/h3&gt;

&lt;p&gt;If you’re using Cursor, you can configure &lt;code&gt;mcp-caldav&lt;/code&gt; as a global MCP server so the AI can call these tools automatically whenever you ask calendar-related questions.&lt;/p&gt;

&lt;h4&gt;
  
  
  Using &lt;code&gt;uvx&lt;/code&gt; (no local checkout)
&lt;/h4&gt;

&lt;p&gt;Your MCP config might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"mcp-caldav"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"uvx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"mcp-caldav"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"CALDAV_URL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://caldav.example.com/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"CALDAV_USERNAME"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your-username"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"CALDAV_PASSWORD"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your-password"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Using a local clone (for development)
&lt;/h4&gt;

&lt;p&gt;If your repo lives at &lt;code&gt;/Users/you/dev/caldav-mcp&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"mcp-caldav"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"uv"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"run"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"--directory"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/Users/you/dev/caldav-mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcp-caldav"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"CALDAV_URL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://caldav.example.com/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"CALDAV_USERNAME"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your-username"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"CALDAV_PASSWORD"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your-password"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After that, Cursor will expose the &lt;code&gt;mcp-caldav&lt;/code&gt; tools and the AI can call them behind the scenes when you say things like “What does my Thursday look like?”.&lt;/p&gt;




&lt;h3&gt;
  
  
  What Tools Does &lt;code&gt;mcp-caldav&lt;/code&gt; Expose?
&lt;/h3&gt;

&lt;p&gt;Here’s a quick overview of the main tools and how I imagine using them in real life.&lt;/p&gt;

&lt;h4&gt;
  
  
  Basic operations
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;caldav_list_calendars&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
List all calendars you have access to (personal, work, shared, etc.).&lt;br&gt;&lt;br&gt;
Useful when you want the AI to choose a target calendar or help you discover what’s available.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;caldav_create_event&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Create a new event with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;title, description, location&lt;/li&gt;
&lt;li&gt;start/end timestamps or duration&lt;/li&gt;
&lt;li&gt;recurrence rules (daily/weekly/monthly/yearly)&lt;/li&gt;
&lt;li&gt;categories/tags&lt;/li&gt;
&lt;li&gt;priority (0–9)&lt;/li&gt;
&lt;li&gt;attendees with statuses&lt;/li&gt;
&lt;li&gt;multiple reminders&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;caldav_get_events&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Fetch events in a date range. Returns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UID&lt;/li&gt;
&lt;li&gt;categories, priority&lt;/li&gt;
&lt;li&gt;attendees and their statuses&lt;/li&gt;
&lt;li&gt;recurrence details&lt;/li&gt;
&lt;li&gt;reminders&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;caldav_get_today_events&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
All events for today, including all-day entries. Very handy for “What’s on my plate today?” queries.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;caldav_get_week_events&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Events for the current week, with an option to define whether the week starts “today” or on Monday. Great for weekly planning prompts.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Advanced operations
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;caldav_get_event_by_uid&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Look up a single event by UID. Good for follow-ups like “Show me more details about that last meeting you mentioned.”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;caldav_delete_event&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Delete an event by UID. Perfect for cleaning up test events or cancelling a meeting programmatically.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;caldav_search_events&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Search by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;text (title / description)&lt;/li&gt;
&lt;li&gt;location&lt;/li&gt;
&lt;li&gt;attendees&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where you can do things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Find all events with ‘performance review’ in the title this year.”&lt;/li&gt;
&lt;li&gt;“Show meetings with Alice in the last month.”&lt;/li&gt;
&lt;li&gt;“List all events tagged &lt;code&gt;#deep-work&lt;/code&gt; next quarter.”&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  Dev Experience and Code Quality
&lt;/h3&gt;

&lt;p&gt;As someone who cares about code quality but also doesn’t want to spend hours yak-shaving, I really like how the project wires up tooling.&lt;/p&gt;
&lt;h4&gt;
  
  
  Linting, formatting, typing
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ruff&lt;/code&gt;&lt;/strong&gt; – fast linting + formatting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;mypy&lt;/code&gt;&lt;/strong&gt; – static type checking&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;pre-commit&lt;/code&gt;&lt;/strong&gt; – runs checks before you commit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To get everything installed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv &lt;span class="nb"&gt;sync&lt;/span&gt; &lt;span class="nt"&gt;--group&lt;/span&gt; dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then you can run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make check      &lt;span class="c"&gt;# run all quality checks&lt;/span&gt;
make lint       &lt;span class="c"&gt;# lint only&lt;/span&gt;
make format     &lt;span class="c"&gt;# format code&lt;/span&gt;
make type-check &lt;span class="c"&gt;# type checking&lt;/span&gt;
make &lt;span class="nb"&gt;test&lt;/span&gt;       &lt;span class="c"&gt;# run tests&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Testing
&lt;/h4&gt;

&lt;p&gt;Unit tests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;span class="c"&gt;# or&lt;/span&gt;
make test-unit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;End-to-end tests (against a real CalDAV server):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Copy &lt;code&gt;.env.e2e.example&lt;/code&gt; to &lt;code&gt;.env.e2e&lt;/code&gt; and fill in real credentials.&lt;/li&gt;
&lt;li&gt;Run:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   make test-e2e
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Coverage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make test-cov        &lt;span class="c"&gt;# coverage in terminal&lt;/span&gt;
make coverage-html   &lt;span class="c"&gt;# nice HTML report in htmlcov/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It’s the kind of setup where you can refactor the client/server code and get quick feedback if you broke something important.&lt;/p&gt;




&lt;h3&gt;
  
  
  Why It’s in &lt;code&gt;awesome-mcp-servers&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://github.com/punkpeye/awesome-mcp-servers" rel="noopener noreferrer"&gt;&lt;code&gt;awesome-mcp-servers&lt;/code&gt;&lt;/a&gt; list curates high-quality MCP servers. &lt;code&gt;mcp-caldav&lt;/code&gt; fits nicely there because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It connects an AI to &lt;strong&gt;real-world data&lt;/strong&gt; (your calendar) using a standard protocol.&lt;/li&gt;
&lt;li&gt;The codebase is clean, reasonably small, and easy to navigate.&lt;/li&gt;
&lt;li&gt;It has a good testing story (unit + E2E).&lt;/li&gt;
&lt;li&gt;Docs are actually helpful (&lt;code&gt;README.md&lt;/code&gt;, &lt;code&gt;USAGE.md&lt;/code&gt;, &lt;code&gt;QUICKSTART.md&lt;/code&gt;, &lt;code&gt;PROVIDER_NOTES.md&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’re thinking about writing your own MCP server, this repo is a nice example of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to separate transport (MCP) from domain logic (CalDAV client).&lt;/li&gt;
&lt;li&gt;How to design a small but expressive tool surface.&lt;/li&gt;
&lt;li&gt;How to plug into existing infrastructure (CalDAV servers) without reinventing everything.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Wrapping Up
&lt;/h3&gt;

&lt;p&gt;If you want your AI to do more than just chat and actually &lt;strong&gt;work with your schedule&lt;/strong&gt;, &lt;code&gt;mcp-caldav&lt;/code&gt; is a solid starting point:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It speaks a standard protocol (CalDAV).&lt;/li&gt;
&lt;li&gt;It exposes well-defined MCP tools.&lt;/li&gt;
&lt;li&gt;It’s already battle-tested enough to land in &lt;code&gt;awesome-mcp-servers&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can check it out here:&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/madbonez/caldav-mcp" rel="noopener noreferrer"&gt;&lt;code&gt;https://github.com/madbonez/caldav-mcp&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you end up wiring it into your own setup or extending it (e.g., adding update/patch operations or richer search), that’s exactly the kind of thing I’d expect from someone building serious MCP-based workflows.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>python</category>
      <category>ai</category>
      <category>agents</category>
    </item>
  </channel>
</rss>
