CalDAV MCP Server
MCP CalDAV Server
Universal MCP server for CalDAV protocol integration. Works with any CalDAV-compatible calendar server including Yandex Calendar, Google Calendar (via CalDAV), Nextcloud, ownCloud, Apple iCloud, and others.
š Quick Start: See QUICKSTART.md for a quick guide to get started with
uv. š§ Cursor Setup: See CURSOR_SETUP.md for detailed Cursor IDE configuration instructions.
Features
List available calendars
Create calendar events with reminders and attendees
Get events for today, week, or custom date range
Works with any CalDAV-compatible server (Yandex, Google, Nextcloud, ownCloud, iCloud, etc.)
Installation
Using uv (Recommended)
First, install uv if you haven't already:
macOS/Linux:
curl -LsSf https://astral.sh/uv/install.sh | shWindows:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"Then install the project:
uv sync --devThis will:
Create a virtual environment (
.venv)Install all dependencies including dev dependencies
Generate a
uv.lockfile
Using uvx (Run without installation)
You can also run the server directly without installing it:
uvx mcp-caldavUsing pip
pip install -e .Configuration
Set the following environment variables:
export CALDAV_URL="https://caldav.example.com/"
export CALDAV_USERNAME="your-username"
export CALDAV_PASSWORD="your-password"CalDAV Server URLs
Common CalDAV server URLs:
Yandex Calendar:
https://caldav.yandex.ru/Google Calendar:
https://apidata.googleusercontent.com/caldav/v2/(requires OAuth setup)Nextcloud:
https://your-domain.com/remote.php/dav/calendars/username/ownCloud:
https://your-domain.com/remote.php/dav/calendars/username/Apple iCloud:
https://caldav.icloud.com/(requires app-specific password)FastMail:
https://caldav.fastmail.com/dav/calendars/user/
Note: Some servers require app-specific passwords instead of regular passwords. Check your calendar provider's documentation for CalDAV setup instructions.
Usage
IDE Integration (Cursor)
To use this MCP server in Cursor:
Open Cursor Settings ā Features ā MCP Servers ā + Add new global MCP server
Add the following configuration:
Using uvx (Recommended - no installation needed):
{
"mcpServers": {
"mcp-caldav": {
"command": "uvx",
"args": ["mcp-caldav"],
"env": {
"CALDAV_URL": "https://caldav.example.com/",
"CALDAV_USERNAME": "your-username",
"CALDAV_PASSWORD": "your-password"
}
}
}
}Using local installation (after uv sync or pip install):
{
"mcpServers": {
"mcp-caldav": {
"command": "mcp-caldav",
"env": {
"CALDAV_URL": "https://caldav.example.com/",
"CALDAV_USERNAME": "your-username",
"CALDAV_PASSWORD": "your-password"
}
}
}
}Using local development version:
{
"mcpServers": {
"mcp-caldav": {
"command": "uv",
"args": ["run", "--directory", "/path/to/caldav", "mcp-caldav"],
"env": {
"CALDAV_URL": "https://caldav.example.com/",
"CALDAV_USERNAME": "your-username",
"CALDAV_PASSWORD": "your-password"
}
}
}
}Example for Yandex Calendar:
{
"mcpServers": {
"mcp-caldav": {
"command": "uvx",
"args": ["mcp-caldav"],
"env": {
"CALDAV_URL": "https://caldav.yandex.ru/",
"CALDAV_USERNAME": "your-username@yandex.ru",
"CALDAV_PASSWORD": "your-app-password"
}
}
}
}ā ļø Note: Yandex Calendar has aggressive rate limiting (60 seconds per MB since 2021). Write operations (create/update/delete) may experience 504 timeouts, so space out requests and introduce manual delays. For write-heavy workloads, consider using Google Calendar or Nextcloud instead. See PROVIDER_NOTES.md for details.
Testing status: End-to-end tests currently run only against Yandex Calendar. Other CalDAV providers follow the same protocol and should work, but they have not been integration-tested yet.
Example for Nextcloud:
{
"mcpServers": {
"mcp-caldav": {
"command": "uvx",
"args": ["mcp-caldav"],
"env": {
"CALDAV_URL": "https://your-domain.com/remote.php/dav/calendars/username/",
"CALDAV_USERNAME": "your-username",
"CALDAV_PASSWORD": "your-password"
}
}
}
}As MCP Server
The server can be used with MCP-compatible clients:
Using uv (after uv sync):
uv run mcp-caldavNote: uvx works only with published packages from PyPI. For local development, use uv run mcp-caldav after uv sync.
Using pip (after installation):
mcp-caldavOr with custom options:
uv run mcp-caldav --caldav-url "https://caldav.example.com/" \
--caldav-username "your-username" \
--caldav-password "your-password" \
--verboseAvailable Tools
Basic Operations:
caldav_list_calendars- List all available calendarscaldav_create_event- Create a new calendar event (supports recurrence, categories, priority, attendees)caldav_get_events- Get events for a date range (returns extended fields: UID, categories, priority, attendees, recurrence)caldav_get_today_events- Get events for todaycaldav_get_week_events- Get events for the week
Advanced Operations:
caldav_get_event_by_uid- Get a specific event by its UIDcaldav_delete_event- Delete an event by UIDcaldav_search_events- Search events by text, attendees, or location
Features Supported:
Recurring events (RRULE) - Daily, Weekly, Monthly, Yearly patterns
Categories/Tags - Organize events with categories
Priority - Set priority levels (0-9, 0 = highest)
Attendees with statuses - Track acceptance status (ACCEPTED/DECLINED/TENTATIVE/NEEDS-ACTION)
Reminders - Multiple reminders per event
Development
Code Quality
This project uses several tools to ensure code quality:
mypy - Static type checking with strict rules
ruff - Fast linting and code formatting
pre-commit - Automatic checks before commits
Run quality checks:
# Install dev dependencies
uv sync --group dev
# Run all checks
make check
# Or individually
make lint
make format
make type-check
# Or using pre-commit
make pre-commit-runSetup pre-commit hooks:
uv run pre-commit installSee CODE_QUALITY.md for detailed information.
Running Tests
Unit tests (with mocks):
make test
# or
make test-unitE2E tests (require real CalDAV server):
# Create .env.e2e file with your credentials, then:
make test-e2eAll tests:
make testWith coverage:
make test-cov # Terminal report
make coverage-html # HTML reportSee tests/e2e/README.md for more details on e2e tests.
Project Structure
caldav/
āāā src/
ā āāā mcp_caldav/
ā āāā __init__.py # Main entry point
ā āāā server.py # MCP server implementation
ā āāā client.py # CalDAV client wrapper
āāā tests/
ā āāā test_server.py # Server unit tests
ā āāā test_client.py # Client unit tests
ā āāā e2e/ # End-to-end tests with real server
ā āāā test_client_e2e.py
ā āāā conftest.py
āāā pyproject.toml # Project configuration
āāā Makefile # Development commands
āāā README.md # This fileLicense
See LICENSE file for details.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/madbonez/caldav-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server