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.
First, install uv if you haven't already:
macOS/Linux:
curl -LsSf https://astral.sh/uv/install.sh | sh
Windows:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
Then install the project:
uv sync --dev
This will:
.venv)uv.lock fileYou can also run the server directly without installing it:
uvx mcp-caldav
pip install -e .
Set the following environment variables:
export CALDAV_URL="https://caldav.example.com/"
export CALDAV_USERNAME="your-username"
export CALDAV_PASSWORD="your-password"
Common CalDAV server URLs:
https://caldav.yandex.ru/https://apidata.googleusercontent.com/caldav/v2/ (requires OAuth setup)https://your-domain.com/remote.php/dav/calendars/username/https://your-domain.com/remote.php/dav/calendars/username/https://caldav.icloud.com/ (requires app-specific password)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.
To use this MCP server in Cursor:
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"
}
}
}
}
The server can be used with MCP-compatible clients:
Using uv (after uv sync):
uv run mcp-caldav
Note: uvx works only with published packages from PyPI. For local development, use uv run mcp-caldav after uv sync.
Using pip (after installation):
mcp-caldav
Or with custom options:
uv run mcp-caldav --caldav-url "https://caldav.example.com/" \
--caldav-username "your-username" \
--caldav-password "your-password" \
--verbose
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 weekAdvanced 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 locationFeatures Supported:
This project uses several tools to ensure code quality:
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-run
Setup pre-commit hooks:
uv run pre-commit install
See CODE_QUALITY.md for detailed information.
Unit tests (with mocks):
make test
# or
make test-unit
E2E tests (require real CalDAV server):
# Create .env.e2e file with your credentials, then:
make test-e2e
All tests:
make test
With coverage:
make test-cov # Terminal report
make coverage-html # HTML report
See tests/e2e/README.md for more details on e2e tests.
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 file
See LICENSE file for details.