caldav-mcp
caldav-mcp
Дайте вашему ИИ-ассистенту календарь. MCP-сервер, который предоставляет доступ на чтение и запись к любому календарю с поддержкой CalDAV — Nextcloud, Radicale, Baikal, ownCloud, iCloud, Fastmail и другим, — через 14 специализированных инструментов.
Зачем caldav-mcp?
Dockerized | Многоступенчатый образ на базе Alpine, выполнение без привилегий root, встроенный healthcheck. Разворачивайте там, где работает Docker. |
Python 3.13 | Чистая типизированная кодовая база с валидацией Pydantic. Легко читать и легко расширять. |
Один контейнер | Одна команда |
Без состояния | Между запросами не сохраняется состояние сессии. Учётные данные передаются с каждым запросом в HTTP-заголовках, что позволяет использовать multi-tenant без перезапуска сервера. |
Безопасность по умолчанию | Сравнение токенов за постоянное время, ограничение частоты запросов по IP с экспоненциальной задержкой, санитизация входных данных, структурированный аудит журнала, никаких секретов в ответах об ошибках. |
Двухуровневая аутентификация | Опциональный API-ключ защищает конечную точку MCP; учётные данные CalDAV подставляются для каждого запроса. Уровни независимы, компонуемы и без неожиданностей. |
Related MCP server: mcp-labrat
Где это полезно
Управление календарём с помощью ИИ — Позвольте Claude, Codex или любому MCP-клиенту создавать, обновлять, искать и удалять события через естественный язык.
Мультитенантный доступ — Отправляйте разные
X-Caldav-*заголовки в каждом запросе, чтобы работать с разными учётными записями CalDAV на одном экземпляре сервера.Автоматизация календаря на собственном сервере — Работает с уже существующим Nextcloud, Radicale или Baikal. Без привязки к облаку.
Корпоративные и командные развёртывания — Централизованные, не имеющие состояния, контейнеризированные. Размещайте за обратным прокси, масштабируйте горизонтально, изменяйте учётные данные без простоя.
Быстрый старт
# 1. Clone the repo
git clone https://git.gelse.net/werner/caldav-mcp.git && cd caldav-mcp
# 2. Create your .env file
cp .env.example .env
# Edit .env — at minimum set CALDAV_MCP_API_KEY, CALDAV_URL, CALDAV_USERNAME, CALDAV_PASSWORD
# 3. Launch
docker compose up -d
# 4. Verify
curl -s http://localhost:8600/mcp \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "X-Caldav-Url: https://cloud.example.com/remote.php/dav/calendars/user/" \
-H "X-Caldav-Username: user" \
-H "X-Caldav-Password: app-password" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1"}}}'Теперь сервер доступен по адресу http://localhost:8600/mcp (Streamable HTTP).
Инструменты
Сервер предоставляет 14 MCP-инструментов в трёх категориях.
Запросы (только чтение)
Tool | Description |
Список всех доступных календарей | |
Получить события за указанный период дат | |
Получить события на сегодня | |
Получить события на следующие 7 дней | |
Получить конкретное событие по UID (включая участников) | |
Искать события по тексту: в теме, описании, месте и категориях | |
Получить данные о свободном/занятом времени за период |
Изменения (запись)
Tool | Description |
Создать новое событие — поддерживает RRULE, приоритет, категории, участников | |
Частично изменить существующее событие по UID | |
Удалить событие по UID | |
Переместить событие между календарями |
Участники
Tool | Description |
Добавить участника к событию | |
Удалить участника из события | |
Список участников события |
Развёртывание
Docker
Проект поставляется с многоступенчатым Dockerfile:
Этап сборки — устанавливает Python-зависимости из
requirements.txtв чистый префикс.Этап выполнения — копирование ранее собранные пакеты в минимальный Alpine-образ, работает из-под непривилегированного пользователя
app, открывает порт8080.
docker build -t caldav-mcp:latest .
docker run -p 8600:8080 \
-e CALDAV_MCP_API_KEY=YOUR_KEY \
-e CALDAV_URL=https://cloud.example.com/remote.php/dav/calendars/user/ \
-e CALDAV_USERNAME=user \
-e CALDAV_PASSWORD=app-password \
caldav-mcp:latestDocker Compose
docker-compose.yaml сопоставляет порт хоста 8600 с портом контейнера 8080 и читает переменные окружения из локального файла .env:
services:
caldav-mcp:
build: .
image: caldav-mcp:latest
restart: unless-stopped
ports:
- "8600:8080"
environment:
CALDAV_MCP_API_KEY: "${CALDAV_MCP_API_KEY:-}"
TZ: Europe/Viennadocker compose up -dТакже для интеграционных тестов доступен docker-compose.test.yaml — он включает CalDAV-сервер Radicale.
TLS / HTTPS
Сервер поддерживает встроенный TLS без обратного прокси. Используйте следующие переменные окружения для включения HTTPS:
CALDAV_MCP_TLS_CERT=/path/to/cert.pem
CALDAV_MCP_TLS_KEY=/path/to/key.pem
CALDAV_MCP_TLS_CA_BUNDLE=/path/to/ca.pem # optionalКогда TLS включён, сервер слушает HTTPS. Если TLS не настроен, запускайте сервер за обратным прокси (Traefik, Caddy, nginx), который выполняет завершение TLS.
Аутентификация
Два независимых уровня — оба опциональны, но рекомендуются.
Уровень 1: аутентификация конечной точки MCP
Если задан CALDAV_MCP_API_KEY, каждый запрос к конечной точке /mcp должен содержать один из вариантов:
Authorization: Bearer <token>X-Api-Key: <token>
Сравнение токена выполняется за постоянное время, чтобы исключить атаки по вспомогательным каналам, связанным со временем. Неудачные попытки отслеживаются по IP-адресу клиента с помощью скользящего окна с экспоненциальной задержкой.
Если CALDAV_MCP_API_KEY не задан, конечная точка открыта — не публикуйте её в публичный интернет без аутентификации.
Уровень 2: учётные данные CalDAV
Учётные данные CalDAV запрашиваются для каждого запроса:
HTTP-заголовки (предпочтительно):
X-Caldav-Url,X-Caldav-Username,X-Caldav-PasswordПеременные окружения (резервный вариант):
CALDAV_URL,CALDAV_USERNAME,CALDAV_PASSWORD
HTTP-заголовки имеют приоритет. Это позволяет организовать multi-tenant использование: разные клиенты могут направлять запросы к разным учётным записям CalDAV без перезапуска сервера.
Конфигурация
Вся конфигурация задаётся через переменные окружения и проверяется при запуске с помощью Pydantic.
Сервер
Variable | Default | Description |
|
| Порт прослушивания (внутри контейнера) |
|
| Путь к конечной точке Streamable HTTP |
|
| Общий секрет для аутентификации конечной точки MCP |
|
| Часовой пояс IANA (например, |
CalDAV
Variable | Default | Description |
|
| URL-адрес CalDAV-сервера (резерв для заголовка |
|
| Имя пользователя CalDAV (запас для заголовка |
|
| Пароль CalDAV (запасной вариант для заголовка |
|
| Проверять TLS-сертификаты при подключениях к CalDAV. Установите |
Ограничение частоты запросов
Variable | Default | Description |
|
| Максимум Failed попыток аутентификации с одного IP-адреса в рамках скользящего окна |
|
| Длительность скользящего окна в секундах |
TLS
Variable | Default | Description |
|
| Путь к PEM-файлу TLS-сертификата |
|
| Путь к PEM-файлу приватного ключа TLS |
|
| Необязательный пакет CA-сертификатов для пользовательских центров сертификации |
Логирование
Variable | Default | Description |
|
| Формат журнала аудита: |
Безопасность
МВСТАВИТЬ сервер за обратным прокси, который завершает TLS, либо включите встроенный TLS.
Установите надёжный
CALDAV_MCP_API_KEY.Ограничьте доступ на уровне сети/межсетевого экрана доверенными хостами или VPN.
Предпочтительно привязывайте сервер к адресу
127.0.0.1, если явно не нужен удалённый доступ.Никогда не помещайте пароли приложений CalDAV в публичную конфигурацию или журналы.
Разработка
Команды
make test # Run unit tests
make test-integration # Run integration tests (requires docker-compose.test.yaml)
make test-performance # Run performance benchmarks
make lint # Lint with ruff (check + format)
make typecheck # Type check with mypy
make check # All checks: lint + typecheck + deps-check + test
make deps-check # Verify pyproject.toml and requirements.txt are in sync
make build # Build Docker imageСтруктура проекта
caldav-mcp/
├── server.py # Thin entrypoint, launches FastMCP HTTP server
├── caldav_mcp/ # Core package
│ ├── tools/ # MCP tool handlers
│ │ ├── queries.py # Read-only tools (7)
│ │ ├── mutations.py # Write tools (4)
│ │ └── attendees.py # Attendee management (3)
│ ├── auth.py # Two-layer auth (API key + CalDAV creds)
│ ├── calendar.py # CalDAV calendar selection & serialization
│ ├── client_cache.py # Thread-safe LRU cache for DAVClient
│ ├── config.py # Env var parsing, header constants
│ ├── config_schema.py # Pydantic startup validation
│ ├── datetime_utils.py # Date/time parsing, timezone helpers
│ ├── errors.py # Typed exceptions, ToolResult dataclass
│ ├── event_builder.py # Pure iCalendar VEVENT construction
│ ├── sanitizers.py # Input sanitization, field length limits
│ ├── rate_limit.py # Sliding-window rate limiter
│ ├── audit.py # Structured JSON audit logging
│ ├── constants.py # Shared string constants
│ └── types.py # CalDAVClient Protocol definition
├── tests/ # Unit, integration, performance
├── docs/ # Architecture, API, contributing docs
├── Dockerfile # Multi-stage Docker build
├── docker-compose.yaml # Production compose
├── docker-compose.test.yaml # Test compose with Radicale
├── requirements.txt # Runtime dependencies (pinned)
├── pyproject.toml # Dev config and dependencies
└── Makefile # Build/test shortcutsЗависимости
Package | Version | Purpose |
3.4.7 | Фреймворк MCP-сервера, транспорт Streamable HTTP | |
3.2.1 | Клиентская библиотека CalDAV | |
7.2.2 | Разбор/генерация iCalendar RFC 5545 | |
>=2.28.0 | Слой HTTP-транспорта |
Устранение неполадок
Симптом | Причина | Исправление |
| Сервер CalDAV недоступен | Проверьте, что |
| Самоподписанный или недействительный TLS-сертификат | Импортируйте CA-сертификат сервера в системное хранилище доверия или используйте действительный сертификат |
| Отсутствует или неверен API-токен | Установите |
| Отсутствуют заголовки CalDAV или переменные окружения | Укажите заголовки |
| Опечатка или неверное название календаря | Запустите |
События показывают неверное время | Часовой пояс сервера не задан | Установите переменную окружения |
FAQ
В: Можно ли использовать это с несколькими учетными записями CalDAV?
О: Да — отправляйте разные заголовки X-Caldav-Url / X-Caldav-Username / X-Caldav-Password для каждого запроса. Кэш клиента привязан к паре (url, username).
В: Какие серверы CalDAV поддерживаются? О: Любой сервер, реализующий стандарт CalDAV: Nextcloud, ownCloud, iCloud, Fastmail, Baikal, Radicale и другие.
В: Передается ли API-токен безопасно? О: Только при использовании HTTPS. Включите встроенный TLS или разместите сервер за TLS-terminating обратным прокси.
В: Как сгенерировать пароль приложения CalDAV? О: Зависит от вашего провайдера. Nextcloud: Настройки → Безопасность → Пароли приложений. iCloud: Используйте пароль, специфичный для приложения, с appleid.apple.com.
В: Можно ли использовать это через stdio вместо HTTP?
О: Текущий сервер использует только транспорт Streamable HTTP. Чтобы использовать stdio, измените server.py, вызвав mcp.run() вместо mcp.run_http_async().
Лицензия
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceAn MCP server that exposes CalDAV calendar operations as tools for AI assistants. It enables users to connect to CalDAV servers to create and list calendar events within specific timeframes.43297MIT
- FlicenseNot gradedqualityDmaintenanceAn MCP server that enables interaction with CalDAV calendars to manage events and check availability through natural language or voice commands. It provides specific tools for listing, searching, and creating calendar entries using an OpenAI-compatible interface.
- AlicenseNot gradedqualityFmaintenanceProvider-agnostic CalDAV calendar MCP server that connects any CalDAV calendar to AI assistants, enabling calendar operations like listing, creating, updating, and deleting events.AGPL 3.0
- AlicenseNot gradedqualityFmaintenanceA comprehensive MCP server that provides AI assistants with natural language access to Apple Calendar, enabling reading, searching, creating, and managing calendar events.3MIT
Related MCP Connectors
Hosted Google Calendar MCP server for AI agents. No self-hosting or Google Cloud setup.
Calendar API for AI agents: events, availability, Google/Microsoft setup, scheduling, and iCal.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
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/gelse/caldav-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server