Zovo Calendar MCP Server

Gerencie eventos, lembretes e agendamentos a partir dos seus arquivos locais. Servidor MCP offline-first, plano gratuito, sem cadastro.

Documentação

mcp-calendar

Seu aplicativo de calendário pode mostrar a próxima terça-feira. Ele não pode dizer para onde sua semana realmente foi, quais duas coisas você disse sim ao mesmo tempo, ou quantas horas faturáveis as reuniões do mês passado valeram. Este servidor lê o arquivo .ics que seu calendário já exporta e responde a essas perguntas: eventos em qualquer janela com séries recorrentes expandidas corretamente, blocos de ocupado mesclados e as lacunas livres reais dentro do seu horário de trabalho, todas as duplas reservas entre calendários de trabalho e pessoais de uma só vez, uma .ics limpa de apenas os eventos que você escolheu, e o lançamento de tempo exato para uma reunião que você deveria ter faturado. Nenhuma conta é conectada, nada é sincronizado, e o arquivo de calendário permanece na sua máquina como texto simples.

Construído por theluckystrike.

No Registro Oficial MCP (io.github.theluckystrike/calendar-ics-reader-events-freebusy-conflicts).

Listado no Índice de Produtos de IA — endpoint remoto ao vivo em mcp.zovo.one/s/calendar, plano gratuito, sem cadastro.

calendar demo

Importe o .ics que seu calendário exporta, depois pergunte o que está acontecendo, quando você está livre e o que conflita, zero configuração, tudo local.

Instalação em 60 segundos

A publicação no npm para @theluckystrike/mcp-calendar está pendente. Até lá, o pacote de um clique .mcpb ou um clone + build é o caminho funcional, ambos verificados abaixo.

Um clique (.mcpb): baixe calendar.mcpb do lançamento mais recente e clique duas vezes nele no Claude Desktop: https://github.com/theluckystrike/mcp-servers/releases/latest

(claude_desktop_config.json):

{
  "mcpServers": {
    "calendar": {
      "command": "npx",
      "args": ["-y", "@theluckystrike/mcp-calendar"]
    }
  }
}

Claude Code:

claude mcp add calendar -- npx -y @theluckystrike/mcp-calendar

(.cursor/mcp.json):

{
  "mcpServers": {
    "calendar": {
      "command": "npx",
      "args": ["-y", "@theluckystrike/mcp-calendar"]
    }
  }
}

O formulário npx acima começa a funcionar no momento em que o pacote é publicado. Até lá, use o pacote .mcpb acima, ou compile a partir do código-fonte com exatamente estes quatro comandos:

git clone https://github.com/theluckystrike/mcp-servers.git && cd mcp-servers
npm install
npm run build -w packages/mcp-license -w servers/timezone -w servers/calendar

Depois aponte o command do seu cliente para node com um argumento: o caminho absoluto para servers/calendar/dist/index.js.

Para rodar no modo Pro, defina MCP_LICENSE_KEY no mesmo bloco de configuração, ou chame license_activate uma vez com sua chave.

Obtendo o .ics do seu calendário

AplicativoOnde
Google AgendaConfigurações -> Importar e exportar -> Exportar. Você recebe um zip; importe o .ics dentro dele.
Calendário AppleArquivo -> Exportar -> Exportar...
Outlook (desktop)Arquivo -> Salvar calendário, formato iCalendar (.ics)
Outlook / Microsoft 365 (web)Configurações -> Calendário -> Calendários compartilhados -> Publicar, depois use o link ICS (Pro)
Qualquer outroQualquer URL de feed publicado terminando em .ics, ou webcal:// (Pro)

Depois: ics_import {path: "~/Downloads/mike@example.com.ics", name: "work"}

Ferramentas

FerramentaO que faz
ics_importLê um arquivo .ics (path), conteúdos colados (text) ou um feed público (url, Pro) e o mantém localmente sob um nome. Importar o mesmo nome novamente o substitui.
calendars_listCada calendário importado: nome, fonte, contagem de eventos, tamanho, quando foi importado.
events_listCada evento entre duas datas com séries recorrentes expandidas para ocorrências reais, ordenado, no seu próprio fuso horário. Cada linha carrega um id.
events_searchEventos cujo título, descrição, local, organizador ou participantes contêm uma frase.
free_busyBlocos de ocupado mesclados e as lacunas livres dentro do seu horário de trabalho, dia a dia. Eventos marcados como livres/transparentes não contam como ocupados.
conflictsCada par de eventos que se sobrepõem, com a sobreposição em minutos — em todos os calendários, então uma chamada de cliente conflitando com uma corrida escolar é detectada. Uma janela mais longa é reduzida aos 31 dias livres e respondida, nunca recusada.
next_eventA próxima coisa que ainda não começou e quanto tempo falta para ela.
event_exportEscreve eventos escolhidos (por id, ou uma janela inteira) em um novo .ics que você pode enviar. Horários em UTC, então chega corretamente em qualquer cliente.
event_to_time_entryTransforma uma reunião nos argumentos exatos para o entry_add do rastreador de tempo, então uma chamada se torna tempo faturável sem redigitá-la.
ics_forgetRemove um calendário e sua cópia local.
license_status / license_activateMostra o nível; ativa uma chave Pro offline.

O recurso calendar://today dá a agenda de hoje em uma única leitura. O prompt plan_my_day percorre todo o ciclo: o que está acontecendo, o que conflita, onde estão os trechos livres e quais reuniões concluídas devem ser faturadas.

O que o analisador trata

Escrito contra exportações reais, não apenas a especificação: quebra de linha (CRLF, LF simples e CR simples, e quebras que o Exchange coloca dentro de um caractere multibyte, que são reunidas nos bytes antes da decodificação), escape \n \, \; \\, eventos de dia inteiro com um DTEND exclusivo, DURATION em vez de DTEND, horários TZID e UTC, horários flutuantes, RRULE para HOURLY, DAILY, WEEKLY, MONTHLY e YEARLY com COUNT, UNTIL (inclusivo), INTERVAL, BYDAY incluindo ordinais (2MO, -1FR), BYMONTHDAY, BYMONTH e BYSETPOS, EXDATE, RDATE, substituições RECURRENCE-ID (a instância movida substitui a original em vez de aparecer duas vezes), STATUS:CANCELLED, TRANSP:TRANSPARENT e blocos VALARM dentro de um evento. Um evento que não pode ser lido é ignorado e contado em vez de custar o resto do arquivo.

FREQ=MINUTELY e FREQ=SECONDLY são deliberadamente não expandidos: uma dessas regras preenche qualquer janela com milhares de ocorrências e enterra o resto da semana. Esses eventos são listados em sua primeira ocorrência e o motivo é dito em voz alta. Uma regra sem COUNT e sem UNTIL é expandida apenas até a janela que você pediu.

Exportações escritas por este servidor mantêm eventos de dia inteiro como valores DATE, então um feriado sai no mesmo dia em que chegou em vez de um bloco temporizado no dia anterior no fuso da sua máquina.

VTIMEZONE é deliberadamente ignorado. As regras de DST inline de um arquivo são tão atuais quanto o aplicativo que o escreveu; o TZID é mantido e cada deslocamento é calculado a partir dos dados ICU dentro da sua compilação Node, que é o que mantém uma reunião semanal de Varsóvia às 10:00 às 10:00 local através da mudança de relógio de março.

Gratuito vs Pro

GratuitoPro ($19 pagamento único)
Calendários mantidos2ilimitado
Janela por perguntaaté 31 diasqualquer janela
conflicts em uma janela mais longarespondida para os primeiros 31 dias, limite nomeadoqualquer janela
Eventos por exportação50ilimitado
Importar de uma URL ou feed webcal--sim
Todo o restocompletocompleto

Obter Pro, ou $39 para todos os servidores do conjunto, vitalício.

Privacidade

Tudo é local. O arquivo de calendário que você importa é copiado para ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/calendar/ e lido de lá; excluir esse diretório redefine o servidor. Há exatamente uma chamada de rede em todo o servidor, e apenas quando você passa um url você mesmo: ela busca esse endereço uma vez, com um tempo limite de 12 segundos, um limite de 5 MB e uma recusa em endereços de loopback, privados e de metadados de nuvem. Nada é enviado, nenhuma conta é vinculada e chaves de licença verificam offline.

Combina com

  • mcp-timezone, este servidor lê seu fuso horário e o mecanismo .ics dele: converta um horário de reunião, encontre horários entre países, escreva um convite.
  • mcp-time-tracker, event_to_time_entry entrega a ele uma reunião concluída; ele rastreia e relata as horas.
  • mcp-invoice, transforme essas horas rastreadas em uma fatura numerada.
  • office-suite, vários servidores atrás de uma única instalação, uma entrada de configuração.

FAQ

Não. Não há OAuth, nenhum token e nenhuma sincronização. Você exporta um arquivo (ou cola uma URL de feed público no Pro) e ele é lido localmente. Isso também significa que uma importação é um instantâneo: reimporte quando o calendário tiver avançado.

Sim, e isso é a maior parte do código. Uma série semanal é expandida no relógio de parede, então uma reunião de Varsóvia às 10:00 permanece às 10:00 através da mudança de DST em vez de derivar para 11:00. Mensal no dia 31 pula fevereiro em vez de rolar para março, UNTIL inclui a ocorrência que cai exatamente nele, e uma única instância movida substitui a original.

Não é: RFC 5545 torna DTEND exclusivo para um evento de dia inteiro, então 1–3 de junho significa os dias 1 e 2. Este servidor segue a especificação, que é o que seu aplicativo de calendário também faz.

Ele escreve arquivos .ics com event_export, que você pode importar em qualquer lugar. Ele nunca modifica o calendário que leu.

5 MB, que são alguns milhares de eventos. Exporte um intervalo de datas mais estreito se um histórico completo for maior que isso.