Skip to main content
Glama
Isaac-To
by Isaac-To

CalDAV MCP Forwarder

Полностью не имеющий состояния сервер Model Context Protocol, который перенаправляет операции с календарём на CalDAV-сервер из Cloudflare Workers.

Исходный код и инструкции по развёртыванию доступны в репозитории GitHub.

Статус: Функциональный первый релиз. Worker поддерживает обнаружение календарей, поиск/просмотр событий, получение, создание, обновление, удаление событий и запросы свободного/занятого времени.

Подключение в три шага

  1. Откройте https://caldavmcp.anpc.work в браузере.

  2. Введите ваш CalDAV-сервер, имя пользователя и пароль приложения, затем нажмите Test connection. Оставьте Calendar URL пустым, чтобы календари были обнаружены автоматически.

  3. При желании выберите календарь по умолчанию, создайте защищённый токен, затем скопируйте сгенерированный MCP URL или конфигурацию в ваш ИИ-ассистент.

Публичная страница по умолчанию создаёт зашифрованные токены без срока действия для подключения по принципу «установил и забыл». При желании можно выбрать более короткий срок жизни. Учётные данные отправляются по HTTPS на Worker для шифрования и никогда не декодируются в браузере. Поверните CONNECTION_TOKEN_KEY, если токены необходимо отозвать.

Ассистент может выводить список, искать, читать, создавать, обновлять и удалять события, а также запрашивать информацию о свободном/занятом времени. Каждый запрос независим; никакие календари, учётные данные или сессии не сохраняются.

Related MCP server: mcp-labrat

Модель безопасности

Не помещайте необработанные пароли, пароли приложений или токены доступа непосредственно в URL. URL могут сохраняться в истории браузера, обратных прокси, системах аналитики и журналах доступа.

Токены соединения представляют собой зашифрованные значения AES-GCM:

POST https://caldavmcp.anpc.work/mcp/<encrypted-connection-token>

Токен содержит детали подключения, такие как:

{
  "serverUrl": "https://caldav.example.com",
  "calendarUrl": "https://caldav.example.com/calendars/user/work/",
  "username": "user@example.com",
  "password": "app-password",
  "expiresAt": 1797700000
}

Worker расшифровывает каждый токен для одного запроса и сразу после этого отбрасывает детали подключения. Токены не имеют срока действия, если при их создании не был выбран срок; поверните CONNECTION_TOKEN_KEY, чтобы отозвать все токены, созданные с предыдущим ключом. URL событий и свободного/занятого времени должны принадлежать настроенному CalDAV-серверу. Настройте его как секрет Worker. Ключ должен быть URL-безопасным base64, содержащим 128-, 192- или 256-битный AES-ключ.

Предпочитайте пароли приложений, предоставленные провайдером, или OAuth-токены доступа вместо основного пароля учётной записи. Никогда не фиксируйте токены или учётные данные в этом репозитории.

Подключение MCP-клиента

После развёртывания Worker настройте ваш MCP-клиент, указав URL Worker. Точная конфигурация зависит от клиента, но конечная точка такова:

https://caldavmcp.anpc.work/mcp/<encrypted-connection-token>

Для конфигурации MCP-клиента, который принимает удалённый HTTP-сервер, используйте конечную точку в качестве URL сервера. Например:

{
  "mcpServers": {
    "caldav": {
      "type": "http",
      "url": "https://caldavmcp.anpc.work/mcp/<encrypted-connection-token>"
    }
  }
}

Не вставляйте приведённый выше пример токена в реальный клиент. Замените его токеном, сгенерированным для нужной учётной записи CalDAV и календаря.

Ассистент сможет вызывать такие инструменты, как:

  • list_calendars

  • list_events

  • search_events

  • get_event

  • create_event

  • update_event

  • delete_event

Примеры запросов, которые может обработать ассистент:

  • «Что у меня в рабочем календаре завтра?»

  • «Создай запись к стоматологу на следующий вторник в 10:00.»

  • «Перенеси мою встречу в 15:00 на пятницу.»

  • «Отмени событие с названием "Project review".»

  • «Найди все события, упоминающие ежеквартальное плановое совещание.»

Ассистент должен подтверждать важные деструктивные действия, особенно удаление событий, перед вызовом соответствующего инструмента.

Формат вывода инструментов

Ответы инструментов используют компактный JSON, содержащий только информацию, необходимую для следующего действия:

  • Списки календарей содержат url, а также доступные displayName, description, timezone и color.

  • Списки событий и get_event содержат url, опциональный etag и текущие iCalendar data.

  • create_event возвращает url созданного события.

  • update_event возвращает url обновлённого события.

  • delete_event возвращает url удалённого события и deleted: true.

  • get_free_busy возвращает только iCalendar data свободного/занятого времени.

Ответы не включают HTTP-статусы, необработанные метаданные CalDAV или форматирование представления.

Развёртывание

Установите зависимости:

npm install

Запустите Worker локально:

npm run dev

Проверьте типы в проекте:

npm run typecheck

Запуск модульных тестов

npm test

Запуск тестов с покрытием

npm run coverage

Пороги покрытия установлены на уровне 90% для операторов, строк и функций, и 85% для ветвлений. Текущие модули исходного кода, поддающиеся модульному тестированию, показывают 100% по всем четырём категориям. Точка входа Cloudflare Worker исключена, так как она требует среды выполнения Workers и внешних CalDAV-сервисов; проверяйте её с помощью развёрнутого или wrangler dev дымового теста.

Разверните на Cloudflare Workers:

npx wrangler login
npm run deploy

Worker настроен как пользовательский домен Cloudflare по адресу caldavmcp.anpc.work. Wrangler создаёт домен и сертификат, когда зона активна в той же учётной записи Cloudflare. Установите необходимый секрет перед развёртыванием:

npx wrangler secret put CONNECTION_TOKEN_KEY
npm run deploy

Домен должен быть активен в DNS Cloudflare. Не добавляйте конфликтующую CNAME-запись для caldavmcp.anpc.work; пользовательские домены управляют DNS-записью.

Установите ключ шифрования как секрет Cloudflare Worker:

npx wrangler secret put CONNECTION_TOKEN_KEY

Для локальной разработки создайте .dev.vars из .dev.vars.example и замените заполнитель на сгенерированный ключ. Wrangler автоматически загружает .dev.vars при запуске npm run dev; не фиксируйте этот файл.

cp .dev.vars.example .dev.vars
openssl rand -base64 32 | tr '+/' '-_' | tr -d '='

Никогда не помещайте ключ шифрования в wrangler.jsonc, исходный код или конфигурацию клиента.

Доступные инструменты

Все инструменты работают с календарём, выбранным через calendarUrl в токене, или принимают явный calendarUrl, где это уместно.

Инструмент

Назначение

list_calendars

Обнаружить календари в учётной записи.

list_events

Вывести список событий за обязательный диапазон start/end. Без calendarUrl ищет по всем календарям.

search_events

Искать данные событий по тексту. Без calendarUrl ищет по всем календарям.

get_event

Получить событие по его URL объекта.

create_event

Создать событие с заголовком, началом и концом.

update_event

Обновить событие, используя его текущие iCalendar-данные и URL объекта.

delete_event

Удалить событие, опционально указав его ETag.

get_free_busy

Запросить данные свободного/занятого времени за временной диапазон.

Даты должны быть строками в формате ISO 8601, например 2026-08-20T10:00:00Z. Обновления событий требуют текущих iCalendar data, чтобы сохранить неизвестные свойства, специфичные для провайдера.

Поведение инструментов для агентов

  • Сначала вызовите list_calendars, если доступные URL календарей неизвестны.

  • list_events и search_events требуют start и end. Явный calendarUrl выбирает один календарь. Без него используется календарь, настроенный в токене; если ни один не настроен, поиск ведётся по всем календарям.

  • search_events выполняет текстовый поиск без учёта регистра по iCalendar-данным каждого события, а не только по заголовку.

  • get_event требует текущий HTTPS URL объекта события.

  • create_event требует summary, start и end; выбор календаря: явный URL, календарь из токена, затем первый доступный календарь.

  • update_event требует текущие data события; отправляйте только те поля, которые должны измениться, так как опущенные поля сохраняются.

  • delete_event безвозвратно удаляет событие. Сначала подтвердите удаление с пользователем и передавайте текущий ETag, если он доступен.

  • get_free_busy возвращает iCalendar-данные свободного/занятого времени для запрошенного диапазона и не выводит детали событий.

Поток запросов без состояния

MCP client
   |
   | POST /mcp/<encrypted-token>
   v
Cloudflare Worker
   | decrypt token in memory
   | create request-scoped CalDAV client
   | perform one operation
   | discard credentials and response data
   v
CalDAV server

Никакие данные календаря или состояние MCP-сессии не сохраняются этим Worker. Тело запроса, учётные данные и ответ CalDAV существуют только во время запроса.

Заметки по провайдерам

Реализации CalDAV различаются. Возможно, вам понадобится пароль приложения или конечная точка, специфичная для провайдера:

  • Nextcloud: обычно поддерживает пароли приложений и URL коллекций календарей.

  • Fastmail: используйте пароль, специфичный для приложения, и конечную точку CalDAV, предоставленную Fastmail.

  • iCloud: как правило, требуется пароль приложения и конечная точка CalDAV учётной записи.

  • Google Calendar: нативная поддержка CalDAV ограничена; используйте API Google, если совместимость с CalDAV недостаточна.

Всегда тестируйте обнаружение календарей, повторяющиеся события, часовые пояса, участников, ETag и поведение при удалении с целевым провайдером.

Технологии

  • Cloudflare Workers

  • TypeScript

  • @modelcontextprotocol/sdk

  • tsdav

  • ical.js

  • zod

Ограничения

Сервис перенаправляет запросы и не становится службой синхронизации календарей. Он не ведёт локальный индекс событий, не дедуплицирует события между календарями и не ставит работу в очередь для последующего выполнения. Если провайдер CalDAV недоступен, запрос завершается ошибкой без повторной попытки из постоянного хранилища.

A
license - permissive license
-
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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

  • F
    license
    -
    quality
    D
    maintenance
    An 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.
  • A
    license
    -
    quality
    F
    maintenance
    Provider-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
  • A
    license
    A
    quality
    B
    maintenance
    MCP server for Apple Calendar and CalDAV providers. Enables listing, creating, updating, deleting events, and checking free/busy status with per-calendar write protection.
    8
    6
    MIT

View all related MCP servers

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.

  • MCP server connecting AI agents to non-custodial staking data across 130+ networks.

View all MCP Connectors

Latest Blog Posts

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/Isaac-To/caldav_mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server