dav-mcp

Transforme qualquer calendário, agenda de contatos ou lista de tarefas em um sistema orquestrado por IA. Independente de plataforma via CalDAV/CardDAV — funciona com Nextcloud, Baikal, Radicale, Fastmail e qualquer servidor DAV compatível com padrões. 26 ferramentas com atualizações independentes de campo.

Documentação

dav-mcp

Dê aos seus agentes de IA o poder da organização — Transforme-os em assistentes orquestradores que gerenciam calendários, contatos e tarefas.

Construído com 27 ferramentas prontas para produção que abrangem os protocolos CalDAV, CardDAV e VTODO.

License: MIT npm version


Início Rápido

Instalação em um clique (Claude Desktop)

  1. Baixe o dav-mcp-<version>.mcpb do último lançamento. Lançamentos a partir da versão 4.1.2 incluem este arquivo.
  2. Abra-o com o Claude Desktop (macOS ou Windows). O Claude exibirá uma caixa de diálogo de instalação.
  3. Insira a URL do servidor, nome de usuário e senha. A senha é armazenada como um segredo. Deixe o método de autenticação em Basic a menos que seu servidor exija Digest.

O arquivo .mcpb é um MCP Bundle: o servidor com suas dependências, portanto não é necessário instalar Node.js nem npx.

Claude Desktop / Cursor (Local)

Adicione ao seu arquivo de configuração MCP:

{
  "mcpServers": {
    "dav-mcp": {
      "command": "npx",
      "args": ["-y", "dav-mcp"],
      "env": {
        "CALDAV_SERVER_URL": "https://dav.example.com",
        "CALDAV_USERNAME": "your_username",
        "CALDAV_PASSWORD": "your_password"
      }
    }
  }
}

Locais do arquivo de configuração:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json
  • Linux: ~/.config/Claude/claude_desktop_config.json

Reinicie o Claude Desktop após adicionar a configuração.


n8n (HTTP Remoto)

Inicie o servidor HTTP:

CALDAV_SERVER_URL=https://dav.example.com \
CALDAV_USERNAME=your_username \
CALDAV_PASSWORD=your_password \
BEARER_TOKEN=your-secret-token \
npx dav-mcp --http

Depois, no n8n:

  1. Adicione o nó AI Agent
  2. Adicione o nó MCP Client Tool e conecte-o ao AI Agent
  3. Configure:
    • MCP Endpoint: http://localhost:3000/mcp
    • Autenticação: Bearer
    • Token: seu-token-secreto

Porta personalizada:

npx dav-mcp --http --port=8080

Docker

Baixe a imagem publicada (distroless, executa como não-root, sem shell):

docker run -d --name dav-mcp -p 3000:3000 --env-file .env \
  ghcr.io/philflowio/dav-mcp:latest

Tags: latest, o lançamento exato (5.0.0) e a linha menor (5.0). Defina PORT para servir em uma porta diferente; o healthcheck o acompanha.

Ou compile a partir do código-fonte:

git clone https://github.com/PhilflowIO/dav-mcp.git
cd dav-mcp
cp .env.example .env
# Edit .env with your credentials
docker-compose up

A Orquestração

Quando ferramentas parciais forçam sua IA a improvisar, ferramentas completas permitem que ela execute operações precisas em todos os componentes.

Capacidadedav-mcpA maioria dos MCPs
Gerenciamento de CalendárioCRUD completo (12 ferramentas)Apenas criar + listar (2-3 ferramentas)
Gerenciamento de ContatosCardDAV completo (8 ferramentas)Frequentemente ausente
Gerenciamento de TarefasSuporte completo a VTODO (7 ferramentas)Raramente incluído
Atualizações Baseadas em CamposTodas as propriedades RFC + campos personalizadosRaramente disponível
Livre/OcupadoFunciona em todos os servidores (lado do cliente)REPORT nativo, não suportado pela maioria
Filtragem no ServidorConsultas eficientesDespeja todos os dados
Multi-ProvedorQualquer servidor CalDAV/CardDAVSuporte limitado a provedores
Total de Ferramentas27 ferramentas2-6 ferramentas

Ferramentas Disponíveis (27 no Total)

Ferramentas CalDAV (12 ferramentas)

  1. list_calendars - Lista todos os calendários disponíveis
  2. list_events - Lista TODOS os eventos (use calendar_query para buscas filtradas)
  3. create_event - Cria um novo evento de calendário
  4. update_event - PREFERIDA: Atualiza qualquer campo do evento (SUMMARY, LOCATION, STATUS, propriedades X-* personalizadas); move ou converte um evento com start_date/end_date/all_day
  5. update_event_raw - Atualiza evento com dados iCal brutos (avançado)
  6. delete_event - Exclui um evento permanentemente
  7. calendar_query - PREFERIDA: Busca e filtra eventos de forma eficiente por texto, intervalo de datas ou local
  8. make_calendar - Cria uma nova coleção de calendário, opcionalmente com um fuso horário (um nome IANA como Europe/Berlin, enviado como VTIMEZONE)
  9. update_calendar - Atualiza propriedades do calendário (nome de exibição, descrição, cor, fuso horário)
  10. delete_calendar - Exclui um calendário e todos os seus eventos
  11. calendar_multi_get - Busca em lote vários eventos específicos por URLs
  12. freebusy_query - Encontra horários livres e ocupados em um intervalo ("quando estou livre?"), calculado no lado do cliente

Ferramentas CardDAV (8 ferramentas)

  1. list_addressbooks - Lista todos os catálogos de endereços disponíveis
  2. list_contacts - Lista TODOS os contatos (use addressbook_query para buscas filtradas)
  3. create_contact - Cria um novo contato (vCard)
  4. update_contact - PREFERIDA: Atualiza qualquer campo do contato (FN, EMAIL, TEL, ORG, ADR, propriedades X-* personalizadas)
  5. update_contact_raw - Atualiza contato com dados vCard brutos (avançado)
  6. delete_contact - Exclui um contato permanentemente
  7. addressbook_query - PREFERIDA: Busca e filtra contatos de forma eficiente por nome, e-mail ou organização
  8. addressbook_multi_get - Busca em lote vários contatos específicos por URLs

Ferramentas VTODO (7 ferramentas)

  1. list_todos - Lista TODAS as tarefas (use todo_query para buscas filtradas)
  2. create_todo - Cria uma nova tarefa com data de vencimento, prioridade e status opcionais
  3. update_todo - PREFERIDA: Atualiza qualquer campo da tarefa (SUMMARY, STATUS, PRIORITY, DUE, PERCENT-COMPLETE, propriedades X-* personalizadas)
  4. update_todo_raw - Atualiza tarefa com dados iCal VTODO brutos (avançado)
  5. delete_todo - Exclui uma tarefa permanentemente
  6. todo_query - PREFERIDA: Busca e filtra tarefas de forma eficiente por status/data de vencimento
  7. todo_multi_get - Busca em lote várias tarefas específicas por URLs

Fusos horários

Um evento ou tarefa escrito sem fuso horário (um horário "flutuante" como DTSTART:20261010T090000, ou uma data de dia inteiro) é lido no fuso horário do seu calendário, conforme especifica o CalDAV (RFC 4791 §9.9): o fuso definido com make_calendar / update_calendar, que list_calendars mostra. Um calendário sem fuso é lido no fuso em que o dav-mcp é executado: a variável de ambiente TZ (por exemplo TZ=Europe/Berlin em Docker ou uma implantação HTTP), caso contrário, o do sistema. Um horário sem fuso fornecido às ferramentas de criação e atualização é lido da mesma forma, e um evento armazenado sem fuso permanece sem ele quando é movido. freebusy_query imprime seus slots no fuso do calendário e o nomeia.


Aplicações no Mundo Real

Fluxos de Automação n8n

  • Gerenciamento de Reuniões: "Mostre-me todas as reuniões de sexta-feira" → calendar_query com filtro de data retorna apenas os eventos relevantes
  • Busca de Contatos: "Encontre todos na Google" → addressbook_query com filtro de organização encontra correspondências com eficiência
  • Relatórios de Tarefas: "Mostre tarefas atrasadas de alta prioridade" → todo_query com filtros retorna resultados específicos
  • Limpeza Agendada: Trabalho cron diário exclui tarefas concluídas usando consultas direcionadas

Integração com Claude Desktop

  • Criação Rápida de Eventos: "Crie reunião de equipe amanhã às 14h" → create_event executa imediatamente
  • Consulta de Contatos: "Qual é o e-mail da Sarah?" → addressbook_query com filtro de nome encontra o contato
  • Visão Geral do Calendário: "O que está na minha agenda na próxima semana?" → calendar_query com intervalo de datas mostra os eventos
  • Gerenciamento de Calendário: "Crie um novo calendário chamado Projeto Luna" → make_calendar cria a coleção

Funciona em Todos os Principais Provedores

Funciona com qualquer servidor CalDAV/CardDAV que siga RFC 4791 e RFC 6352:

  • Nextcloud - Suporte completo
  • Baikal - Suporte completo
  • Radicale - Suporte completo
  • iCloud - Funciona com senha específica do aplicativo
  • Qualquer servidor compatível com RFC - Suporte a protocolo padrão

Autenticação

AUTH_METHOD seleciona como o dav-mcp faz login (sem diferenciar maiúsculas de minúsculas):

AUTH_METHODCredenciaisUso para
Basic (padrão)CALDAV_USERNAME, CALDAV_PASSWORDQuase todos os servidores. Se o servidor oferecer apenas Digest (por exemplo, Baikal configurado para Digest), o dav-mcp alterna para Digest automaticamente — nenhuma configuração necessária.
DigestCALDAV_USERNAME, CALDAV_PASSWORDServidores que aceitam apenas Digest (RFC 7616). Diferente da alternância automática em Basic, que primeiro envia a senha uma vez codificada em Basic e depois é rejeitada, Digest nunca envia a senha — use-o quando a conexão não for HTTPS.
OAuth (ou OAuth2)GOOGLE_*, veja abaixoGoogle Calendar

O dav-mcp requer Node.js 22 ou mais recente. Uma configuração incorreta — um valor desconhecido de AUTH_METHOD, ou credenciais ausentes para o método escolhido — interrompe o servidor na inicialização em vez de recorrer ao Basic.


Google Calendar (OAuth2)

Para o Google Calendar, use autenticação OAuth2:

{
  "mcpServers": {
    "dav-mcp": {
      "command": "npx",
      "args": ["-y", "dav-mcp"],
      "env": {
        "AUTH_METHOD": "OAuth",
        "GOOGLE_USER": "your@gmail.com",
        "GOOGLE_CLIENT_ID": "your-client-id",
        "GOOGLE_CLIENT_SECRET": "your-client-secret",
        "GOOGLE_REFRESH_TOKEN": "your-refresh-token"
      }
    }
  }
}

Segurança

  • Validação de Entrada: Todas as entradas são validadas com esquemas Zod antes da execução
  • Limitação de Taxa (modo HTTP): 100 solicitações por 15 minutos por endereço de cliente, contadas antes da verificação do token bearer. Clientes em loopback ou rede privada (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16) — outro contêiner na mesma rede Docker, por exemplo — recebem 10.000. Limitação: o dav-mcp vê o endereço de quem se conecta a ele. Atrás de um mapeamento de porta Docker ou um proxy reverso, esse é o gateway da ponte ou o proxy, portanto todos os clientes externos compartilham esse único endereço, seu único contador e seu limite elevado. Limite a taxa por cliente no proxy se você expor o transporte HTTP.
  • Autenticação Bearer: Autenticação por token para transporte HTTP
  • Sem Armazenamento de Credenciais: Apenas passagem, nunca registrado ou armazenado em cache
  • Registro Estruturado: Trilha de auditoria com IDs de solicitação, sem exposição de PII
  • Registro de Chamadas de Ferramenta Desativado por Padrão: LOG_TOOL_CALLS=true registra cada chamada de ferramenta com seus argumentos, para depuração — em ~/.local/state/dav-mcp/tool-calls.jsonl (ou $XDG_STATE_HOME, %LOCALAPPDATA% no Windows, ou TOOL_CALL_LOG_FILE), legível apenas por você. TOOL_CALL_LOG_MODE=console o envia para stderr.
  • Proteção CORS: Lista de origens permitidas, bloqueia ataques entre sites

Política de Privacidade

O dav-mcp é executado na sua máquina (ou no seu próprio servidor) e fala apenas com o servidor DAV que você configura. Não possui telemetria e não compartilha nada com seus mantenedores ou terceiros. Os resultados das ferramentas vão para o assistente de IA que chamou a ferramenta. Credenciais e dados de calendário não são armazenados pelo dav-mcp; o registro opcional de chamadas de ferramenta está desativado por padrão. Política completa: PRIVACY.md. Contato: hello@philflow.io.


Documentação


Contribuindo

Pull requests são bem-vindos! Leia CONTRIBUTING.md para as diretrizes.


Licença

Licença MIT - veja LICENSE para detalhes


Agradecimentos

Construído com:

  • tsdav - Excelente biblioteca TypeScript CalDAV/CardDAV
  • tsdav-utils - Camada de utilitários agnóstica a campos para atualizações de campos compatíveis com RFC
  • MCP SDK - Model Context Protocol da Anthropic
  • ical.js - Analisador iCalendar compatível com RFC

Perguntas? Problemas? Crie uma issue no GitHub


Construído para agentes de IA que gerenciam calendários, contatos e tarefas