MewCP Google Calendar MCP
Servidor MCP do Google Calendar hospedado, sem estado e multilocatário que permite que assistentes de IA gerenciem calendários, eventos, agendas e disponibilidade através do Google Calendar.
Documentação
Programe de forma mais inteligente — crie, pesquise e gerencie eventos do Google Calendar por meio de IA.
Um servidor Model Context Protocol (MCP) que expõe a API do Google Calendar para criar, ler, atualizar e excluir eventos e calendários.
Visão geral
O Google Calendar MCP Server oferece gerenciamento completo de calendário diretamente em fluxos de trabalho de IA:
- Liste, pesquise e recupere eventos com filtros robustos por intervalo de tempo, texto e recorrência
- Crie eventos únicos, de dia inteiro, rápidos e recorrentes com participantes, lembretes e links do Meet
- Atualize eventos e gerencie participantes e receba o estado antes/depois em uma única resposta
- Consulte blocos de disponibilidade (free/busy) em vários calendários para encontrar horários livres sem conflitos
Ideal para:
- Assistentes de IA que agendam, reagendam e gerenciam reuniões em nome dos usuários
- Automação de fluxos de trabalho que lê o estado do calendário para disparar ações baseadas em tempo
- Agentes que coordenam disponibilidade e enviam convites entre equipes
Ferramentas
Eventos — Leitura
list_events — Listar eventos de um calendário
Lista eventos de um calendário em um intervalo de tempo opcional. Retorna os eventos em ordem de horário de início. Eventos recorrentes são expandidos em instâncias individuais. Use ISO 8601 para time_min/time_max: 'AAAA-MM-DDTHH:MM:SSZ' (por exemplo, '2026-01-08T00:00:00Z'). Se time_min não for especificado, o padrão são eventos a partir de agora.
Entradas:
- `calendar_id` (string, optional, default: "primary") — Calendar ID. Use 'primary' for the user's main calendar
- `max_results` (int, optional, default: 10) — Maximum number of events to return (1–2500)
- `time_min` (string, optional, default: "") — Start of time range in ISO 8601 format, e.g. '2026-01-08T00:00:00Z'. Defaults to now
- `time_max` (string, optional, default: "") — End of time range in ISO 8601 format, e.g. '2026-01-15T23:59:59Z'. Omit for open-ended
- `query` (string, optional, default: "") — Free-text search query to filter events by title, description, or location
- `show_deleted` (bool, optional, default: false) — Include cancelled events in results
- `page_token` (string, optional, default: "") — Pagination token from a previous response's next_page_token to fetch the next page
Esquema de saída data:
{
count: number;
events: {
id: string;
summary: string | null;
start: { date: string | null; dateTime: string | null; timeZone: string | null; };
end: { date: string | null; dateTime: string | null; timeZone: string | null; };
status: string | null;
htmlLink: string | null;
created: string | null;
updated: string | null;
description: string | null;
location: string | null;
colorId: string | null;
creator: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
organizer: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
recurrence: string[] | null;
recurringEventId: string | null;
originalStartTime: { date: string | null; dateTime: string | null; timeZone: string | null; } | null;
transparency: string | null;
visibility: string | null;
iCalUID: string | null;
sequence: number | null;
attendees: {
email: string;
id: string | null;
displayName: string | null;
organizer: boolean | null;
self: boolean | null;
resource: boolean | null;
optional: boolean | null;
responseStatus: string | null;
comment: string | null;
additionalGuests: number | null;
}[] | null;
attendeesOmitted: boolean | null;
guestsCanInviteOthers: boolean | null;
guestsCanModify: boolean | null;
guestsCanSeeOtherGuests: boolean | null;
hangoutLink: string | null;
conferenceData: object | null;
reminders: { useDefault: boolean; overrides: { method: string; minutes: number; }[] | null; } | null;
eventType: string | null;
}[];
next_page_token: string | null;
}
get_event — Obter um único evento por ID
Obtém todos os detalhes de um evento específico, incluindo participantes, status de RSVP, regras de recorrência, lembretes e informações de conferência.
Entradas:
- `event_id` (string, required) — ID of the event to retrieve
- `calendar_id` (string, optional, default: "primary") — Calendar ID containing the event. Use 'primary' for the user's main calendar
Esquema de saída data:
{
id: string;
summary: string | null;
start: { date: string | null; dateTime: string | null; timeZone: string | null; };
end: { date: string | null; dateTime: string | null; timeZone: string | null; };
status: string | null;
htmlLink: string | null;
created: string | null;
updated: string | null;
description: string | null;
location: string | null;
colorId: string | null;
creator: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
organizer: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
recurrence: string[] | null;
recurringEventId: string | null;
originalStartTime: { date: string | null; dateTime: string | null; timeZone: string | null; } | null;
transparency: string | null;
visibility: string | null;
iCalUID: string | null;
sequence: number | null;
attendees: {
email: string;
id: string | null;
displayName: string | null;
organizer: boolean | null;
self: boolean | null;
resource: boolean | null;
optional: boolean | null;
responseStatus: string | null;
comment: string | null;
additionalGuests: number | null;
}[] | null;
attendeesOmitted: boolean | null;
guestsCanInviteOthers: boolean | null;
guestsCanModify: boolean | null;
guestsCanSeeOtherGuests: boolean | null;
hangoutLink: string | null;
conferenceData: object | null;
reminders: { useDefault: boolean; overrides: { method: string; minutes: number; }[] | null; } | null;
eventType: string | null;
}
search_events — Pesquisar eventos por texto
Pesquisa eventos por texto em títulos, descrições e locais. Opcionalmente, restrinja a pesquisa a um intervalo de tempo com time_min/time_max (ISO 8601, por exemplo, '2026-01-08T00:00:00Z'). Sem um intervalo de tempo, a pesquisa abrange todo o histórico — use sempre um intervalo de tempo para calendários grandes.
Entradas:
- `query` (string, required) — Text to search for in event titles, descriptions, and locations
- `calendar_id` (string, optional, default: "primary") — Calendar ID to search in. Use 'primary' for the user's main calendar
- `max_results` (int, optional, default: 10) — Maximum number of events to return (1–2500)
- `time_min` (string, optional, default: "") — Optional start of time range in ISO 8601 format, e.g. '2026-01-01T00:00:00Z'
- `time_max` (string, optional, default: "") — Optional end of time range in ISO 8601 format, e.g. '2026-12-31T23:59:59Z'
- `page_token` (string, optional, default: "") — Pagination token from a previous response's next_page_token to fetch the next page
Esquema de saída data:
{
count: number;
events: {
id: string;
summary: string | null;
start: { date: string | null; dateTime: string | null; timeZone: string | null; };
end: { date: string | null; dateTime: string | null; timeZone: string | null; };
status: string | null;
htmlLink: string | null;
created: string | null;
updated: string | null;
description: string | null;
location: string | null;
colorId: string | null;
creator: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
organizer: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
recurrence: string[] | null;
recurringEventId: string | null;
originalStartTime: { date: string | null; dateTime: string | null; timeZone: string | null; } | null;
transparency: string | null;
visibility: string | null;
iCalUID: string | null;
sequence: number | null;
attendees: {
email: string;
id: string | null;
displayName: string | null;
organizer: boolean | null;
self: boolean | null;
resource: boolean | null;
optional: boolean | null;
responseStatus: string | null;
comment: string | null;
additionalGuests: number | null;
}[] | null;
attendeesOmitted: boolean | null;
guestsCanInviteOthers: boolean | null;
guestsCanModify: boolean | null;
guestsCanSeeOtherGuests: boolean | null;
hangoutLink: string | null;
conferenceData: object | null;
reminders: { useDefault: boolean; overrides: { method: string; minutes: number; }[] | null; } | null;
eventType: string | null;
}[];
next_page_token: string | null;
}
get_upcoming_events — Obter eventos nos próximos N dias
Obtém eventos que começam de agora até os próximos N dias. Retorna os eventos em ordem de horário de início. Eventos recorrentes são expandidos em instâncias individuais.
Entradas:
- `days` (int, optional, default: 7) — Number of days to look ahead from now
- `calendar_id` (string, optional, default: "primary") — Calendar ID to query. Use 'primary' for the user's main calendar
- `max_results` (int, optional, default: 10) — Maximum number of events to return (1–2500)
Esquema de saída data:
{
count: number;
events: {
id: string;
summary: string | null;
start: { date: string | null; dateTime: string | null; timeZone: string | null; };
end: { date: string | null; dateTime: string | null; timeZone: string | null; };
status: string | null;
htmlLink: string | null;
created: string | null;
updated: string | null;
description: string | null;
location: string | null;
colorId: string | null;
creator: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
organizer: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
recurrence: string[] | null;
recurringEventId: string | null;
originalStartTime: { date: string | null; dateTime: string | null; timeZone: string | null; } | null;
transparency: string | null;
visibility: string | null;
iCalUID: string | null;
sequence: number | null;
attendees: {
email: string;
id: string | null;
displayName: string | null;
organizer: boolean | null;
self: boolean | null;
resource: boolean | null;
optional: boolean | null;
responseStatus: string | null;
comment: string | null;
additionalGuests: number | null;
}[] | null;
attendeesOmitted: boolean | null;
guestsCanInviteOthers: boolean | null;
guestsCanModify: boolean | null;
guestsCanSeeOtherGuests: boolean | null;
hangoutLink: string | null;
conferenceData: object | null;
reminders: { useDefault: boolean; overrides: { method: string; minutes: number; }[] | null; } | null;
eventType: string | null;
}[];
next_page_token: string | null;
}
get_todays_events — Obter todos os eventos de hoje
Obtém todos os eventos agendados para hoje no fuso horário informado. Informe o fuso horário local do usuário para obter o dia correto (por exemplo, 'America/New_York'). O padrão é UTC.
Entradas:
- `calendar_id` (string, optional, default: "primary") — Calendar ID to query. Use 'primary' for the user's main calendar
- `timezone` (string, optional, default: "UTC") — IANA timezone name to determine 'today', e.g. 'America/New_York'. Defaults to UTC
Esquema de saída data:
{
count: number;
events: {
id: string;
summary: string | null;
start: { date: string | null; dateTime: string | null; timeZone: string | null; };
end: { date: string | null; dateTime: string | null; timeZone: string | null; };
status: string | null;
htmlLink: string | null;
created: string | null;
updated: string | null;
description: string | null;
location: string | null;
colorId: string | null;
creator: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
organizer: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
recurrence: string[] | null;
recurringEventId: string | null;
originalStartTime: { date: string | null; dateTime: string | null; timeZone: string | null; } | null;
transparency: string | null;
visibility: string | null;
iCalUID: string | null;
sequence: number | null;
attendees: {
email: string;
id: string | null;
displayName: string | null;
organizer: boolean | null;
self: boolean | null;
resource: boolean | null;
optional: boolean | null;
responseStatus: string | null;
comment: string | null;
additionalGuests: number | null;
}[] | null;
attendeesOmitted: boolean | null;
guestsCanInviteOthers: boolean | null;
guestsCanModify: boolean | null;
guestsCanSeeOtherGuests: boolean | null;
hangoutLink: string | null;
conferenceData: object | null;
reminders: { useDefault: boolean; overrides: { method: string; minutes: number; }[] | null; } | null;
eventType: string | null;
}[];
next_page_token: string | null;
}
list_event_instances — Listar instâncias de um evento recorrente
Lista todas as instâncias individuais de um evento recorrente usando o ID do evento mestre. Use esta ferramenta para ver cada ocorrência de uma série recorrente — use get_event ou list_events para encontrar primeiro o ID do evento mestre. As instâncias incluem recurringEventId (o ID mestre) e originalStartTime (o horário agendado conforme a RRULE, que difere de start se a instância foi reagendada). Opcionalmente, filtre por intervalo de tempo para ver apenas ocorrências futuras ou passadas.
Entradas:
- `recurring_event_id` (string, required) — ID of the master recurring event whose instances to list
- `calendar_id` (string, optional, default: "primary") — Calendar ID containing the recurring event. Use 'primary' for the user's main calendar
- `max_results` (int, optional, default: 10) — Maximum number of instances to return (1–2500)
- `time_min` (string, optional, default: "") — Optional start of time range in ISO 8601 format, e.g. '2026-01-01T00:00:00Z'. Filters to instances starting at or after this time
- `time_max` (string, optional, default: "") — Optional end of time range in ISO 8601 format. Filters to instances starting before this time
- `show_deleted` (bool, optional, default: false) — Include cancelled instances in results
- `page_token` (string, optional, default: "") — Pagination token from a previous response's next_page_token to fetch the next page
Esquema de saída data:
{
count: number;
events: {
id: string;
summary: string | null;
start: { date: string | null; dateTime: string | null; timeZone: string | null; };
end: { date: string | null; dateTime: string | null; timeZone: string | null; };
status: string | null;
htmlLink: string | null;
created: string | null;
updated: string | null;
description: string | null;
location: string | null;
colorId: string | null;
creator: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
organizer: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
recurrence: string[] | null;
recurringEventId: string | null;
originalStartTime: { date: string | null; dateTime: string | null; timeZone: string | null; } | null;
transparency: string | null;
visibility: string | null;
iCalUID: string | null;
sequence: number | null;
attendees: {
email: string;
id: string | null;
displayName: string | null;
organizer: boolean | null;
self: boolean | null;
resource: boolean | null;
optional: boolean | null;
responseStatus: string | null;
comment: string | null;
additionalGuests: number | null;
}[] | null;
attendeesOmitted: boolean | null;
guestsCanInviteOthers: boolean | null;
guestsCanModify: boolean | null;
guestsCanSeeOtherGuests: boolean | null;
hangoutLink: string | null;
conferenceData: object | null;
reminders: { useDefault: boolean; overrides: { method: string; minutes: number; }[] | null; } | null;
eventType: string | null;
}[];
next_page_token: string | null;
}
Eventos — Gravação
create_event — Criar um novo evento de calendário
Cria um novo evento de calendário e, opcionalmente, convida participantes. Para eventos com horário definido, use data e hora no formato ISO 8601: '2026-01-08T14:30:00' com fuso horário. Para eventos de dia inteiro, defina is_all_day=True e use apenas a data: '2026-01-08' — para eventos de dia inteiro, end_time é exclusivo, portanto, um evento de um único dia em 8 de janeiro precisa de end_time='2026-01-09'. Retorna o evento criado com seu ID.
Entradas:
- `summary` (string, required) — Event title
- `start_time` (string, required) — Start time: ISO 8601 datetime e.g. '2026-01-08T14:30:00', or date e.g. '2026-01-08' for all-day events
- `end_time` (string, required) — End time: ISO 8601 datetime or date. For all-day, end is exclusive: event on Jan 8 alone needs end_time='2026-01-09'
- `calendar_id` (string, optional, default: "primary") — Calendar ID to create the event in. Use 'primary' for the user's main calendar
- `description` (string, optional, default: "") — Event description or agenda
- `location` (string, optional, default: "") — Event location. Enables map directions and 'time to leave' alerts in Google Calendar
- `attendees` (list[string], optional, default: []) — Attendee email addresses. Invitation emails are sent per send_updates
- `timezone` (string, optional, default: "UTC") — IANA timezone for the event, e.g. 'America/New_York'. Ignored for all-day events
- `is_all_day` (bool, optional, default: false) — Set True for all-day events. Use date-only format (YYYY-MM-DD) for start_time and end_time
- `color_id` (string, optional, default: "") — Color ID 1–11 for the event. Empty uses the calendar's default color
- `visibility` (string, optional, default: "") — Event visibility: 'default', 'public', 'private', or 'confidential'. Empty uses calendar default
- `transparency` (string, optional, default: "") — Free/busy status: 'opaque' (user shows as busy, default) or 'transparent' (user shows as free/available during this event)
- `reminder_minutes` (int, optional, default: -1) — Minutes before event for a popup reminder (0–40320). Set -1 to use the calendar's default reminders
- `send_updates` (string, optional, default: "all") — Who receives invitation emails: 'all' (everyone), 'externalOnly' (non-Google users only), 'none' (no emails)
- `add_meet` (bool, optional, default: false) — Set True to automatically create a Google Meet video conference link for this event
- `optional_attendees` (list[string], optional, default: []) — Email addresses of optional attendees. These people are invited but their attendance is not required
- `guests_can_invite_others` (bool, optional, default: true) — Whether attendees can invite additional guests. Defaults to True per Google Calendar
- `guests_can_modify` (bool, optional, default: false) — Whether attendees can modify the event. Defaults to False
Esquema de saída data:
{
id: string;
summary: string | null;
start: { date: string | null; dateTime: string | null; timeZone: string | null; };
end: { date: string | null; dateTime: string | null; timeZone: string | null; };
status: string | null;
htmlLink: string | null;
created: string | null;
updated: string | null;
description: string | null;
location: string | null;
colorId: string | null;
creator: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
organizer: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
recurrence: string[] | null;
recurringEventId: string | null;
originalStartTime: { date: string | null; dateTime: string | null; timeZone: string | null; } | null;
transparency: string | null;
visibility: string | null;
iCalUID: string | null;
sequence: number | null;
attendees: {
email: string;
id: string | null;
displayName: string | null;
organizer: boolean | null;
self: boolean | null;
resource: boolean | null;
optional: boolean | null;
responseStatus: string | null;
comment: string | null;
additionalGuests: number | null;
}[] | null;
attendeesOmitted: boolean | null;
guestsCanInviteOthers: boolean | null;
guestsCanModify: boolean | null;
guestsCanSeeOtherGuests: boolean | null;
hangoutLink: string | null;
conferenceData: object | null;
reminders: { useDefault: boolean; overrides: { method: string; minutes: number; }[] | null; } | null;
eventType: string | null;
}
create_quick_event — Criar um evento a partir de linguagem natural
Cria um evento a partir de uma descrição em texto em linguagem natural. O Google Calendar analisa o texto para extrair título, data, hora e recorrência. Exemplos: 'Almoço com a Sarah amanhã ao meio-dia', 'Reunião diária da equipe toda segunda às 9h'. Retorna o evento criado. Para eventos complexos com participantes ou campos personalizados, use create_event.
Entradas:
- `text` (string, required) — Natural language event description, e.g. 'Dentist appointment next Friday at 3pm'
- `calendar_id` (string, optional, default: "primary") — Calendar ID to create the event in. Use 'primary' for the user's main calendar
- `send_updates` (string, optional, default: "all") — Who receives invitation emails: 'all', 'externalOnly', or 'none'
Esquema de saída data:
{
id: string;
summary: string | null;
start: { date: string | null; dateTime: string | null; timeZone: string | null; };
end: { date: string | null; dateTime: string | null; timeZone: string | null; };
status: string | null;
htmlLink: string | null;
created: string | null;
updated: string | null;
description: string | null;
location: string | null;
colorId: string | null;
creator: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
organizer: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
recurrence: string[] | null;
recurringEventId: string | null;
originalStartTime: { date: string | null; dateTime: string | null; timeZone: string | null; } | null;
transparency: string | null;
visibility: string | null;
iCalUID: string | null;
sequence: number | null;
attendees: {
email: string;
id: string | null;
displayName: string | null;
organizer: boolean | null;
self: boolean | null;
resource: boolean | null;
optional: boolean | null;
responseStatus: string | null;
comment: string | null;
additionalGuests: number | null;
}[] | null;
attendeesOmitted: boolean | null;
guestsCanInviteOthers: boolean | null;
guestsCanModify: boolean | null;
guestsCanSeeOtherGuests: boolean | null;
hangoutLink: string | null;
conferenceData: object | null;
reminders: { useDefault: boolean; overrides: { method: string; minutes: number; }[] | null; } | null;
eventType: string | null;
}
create_recurring_event — Criar um evento recorrente com uma RRULE
Cria um evento de calendário recorrente usando um padrão de recorrência RRULE. recurrence_rule deve começar com 'RRULE:' seguido dos parâmetros RFC 5545. Exemplos: 'RRULE:FREQ=DAILY;COUNT=5', 'RRULE:FREQ=WEEKLY;BYDAY=MO,WE,FR', 'RRULE:FREQ=MONTHLY;BYMONTHDAY=15', 'RRULE:FREQ=YEARLY'. Retorna o evento mestre recorrente — as instâncias individuais são expandidas pelo Google Calendar.
Entradas:
- `summary` (string, required) — Event title
- `start_time` (string, required) — Start time of the first occurrence in ISO 8601 format, e.g. '2026-01-08T14:30:00'
- `end_time` (string, required) — End time of the first occurrence in ISO 8601 format, e.g. '2026-01-08T15:30:00'
- `recurrence_rule` (string, required) — RRULE string starting with 'RRULE:', e.g. 'RRULE:FREQ=WEEKLY;BYDAY=MO'
- `calendar_id` (string, optional, default: "primary") — Calendar ID to create the event in. Use 'primary' for the user's main calendar
- `description` (string, optional, default: "") — Event description or agenda
- `location` (string, optional, default: "") — Event location
- `attendees` (list[string], optional, default: []) — Attendee email addresses. Invitation emails are sent per send_updates
- `timezone` (string, optional, default: "UTC") — IANA timezone for the event, e.g. 'America/New_York'
- `transparency` (string, optional, default: "") — Free/busy status: 'opaque' (shows as busy, default) or 'transparent' (shows as free)
- `reminder_minutes` (int, optional, default: -1) — Minutes before each occurrence for a popup reminder (0–40320). Set -1 to use calendar default
- `send_updates` (string, optional, default: "all") — Who receives invitation emails: 'all', 'externalOnly', or 'none'
- `add_meet` (bool, optional, default: false) — Set True to automatically create a Google Meet video conference link for this event
- `optional_attendees` (list[string], optional, default: []) — Email addresses of optional attendees. These people are invited but their attendance is not required
- `guests_can_invite_others` (bool, optional, default: true) — Whether attendees can invite additional guests. Defaults to True per Google Calendar
- `guests_can_modify` (bool, optional, default: false) — Whether attendees can modify the event. Defaults to False
Esquema de saída data:
{
id: string;
summary: string | null;
start: { date: string | null; dateTime: string | null; timeZone: string | null; };
end: { date: string | null; dateTime: string | null; timeZone: string | null; };
status: string | null;
htmlLink: string | null;
created: string | null;
updated: string | null;
description: string | null;
location: string | null;
colorId: string | null;
creator: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
organizer: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
recurrence: string[] | null;
recurringEventId: string | null;
originalStartTime: { date: string | null; dateTime: string | null; timeZone: string | null; } | null;
transparency: string | null;
visibility: string | null;
iCalUID: string | null;
sequence: number | null;
attendees: {
email: string;
id: string | null;
displayName: string | null;
organizer: boolean | null;
self: boolean | null;
resource: boolean | null;
optional: boolean | null;
responseStatus: string | null;
comment: string | null;
additionalGuests: number | null;
}[] | null;
attendeesOmitted: boolean | null;
guestsCanInviteOthers: boolean | null;
guestsCanModify: boolean | null;
guestsCanSeeOtherGuests: boolean | null;
hangoutLink: string | null;
conferenceData: object | null;
reminders: { useDefault: boolean; overrides: { method: string; minutes: number; }[] | null; } | null;
eventType: string | null;
}
update_event — Atualizar um evento existente
Atualiza um evento de calendário existente. Apenas os campos fornecidos são alterados — deixe um campo vazio para manter o valor atual. Busca o evento atual primeiro, aplica as alterações e depois salva. Use ISO 8601 para horários: 'AAAA-MM-DDTHH:MM:SS'. Para eventos recorrentes: informe o ID do evento mestre recorrente para alterar todas as instâncias, ou um ID de instância específico para alterar apenas aquela ocorrência. AVISO: não atualize instâncias individuais uma a uma para alterar toda a série — atualize o evento mestre. Modificar instâncias individualmente cria exceções que poluem o calendário e disparam notificações em excesso. Para cancelar uma única instância sem afetar o restante da série, defina status='cancelled'.
Entradas:
- `event_id` (string, required) — ID of the event to update. For recurring events, use the master event ID to change all instances, or an instance ID to change only one occurrence
- `calendar_id` (string, optional, default: "primary") — Calendar ID containing the event
- `summary` (string, optional, default: "") — New event title. Leave empty to keep existing
- `start_time` (string, optional, default: "") — New start time in ISO 8601 format. Leave empty to keep existing
- `end_time` (string, optional, default: "") — New end time in ISO 8601 format. Leave empty to keep existing
- `description` (string, optional, default: "") — New event description. Leave empty to keep existing
- `location` (string, optional, default: "") — New event location. Leave empty to keep existing
- `timezone` (string, optional, default: "") — Timezone for the updated start/end times, e.g. 'America/New_York'. Leave empty to keep the event's existing timezone
- `status` (string, optional, default: "") — Event status: 'confirmed', 'tentative', or 'cancelled'. Set 'cancelled' on a recurring event instance ID to cancel only that occurrence without affecting the rest of the series
- `transparency` (string, optional, default: "") — Free/busy status: 'opaque' (shows as busy) or 'transparent' (shows as free). Leave empty to keep existing
- `reminder_minutes` (int, optional, default: -1) — Minutes before event for a popup reminder (0–40320). Set -1 to keep existing reminders
- `send_updates` (string, optional, default: "all") — Who receives update notifications: 'all', 'externalOnly', or 'none'
- `add_meet` (bool, optional, default: false) — Set True to add a Google Meet video conference link to this event. Has no effect if a Meet link already exists
- `guests_can_invite_others` (bool, optional) — Whether attendees can invite additional guests. Leave unset to keep existing value
- `guests_can_modify` (bool, optional) — Whether attendees can modify the event. Leave unset to keep existing value
Esquema de saída data:
{
before: {
id: string;
summary: string | null;
start: { date: string | null; dateTime: string | null; timeZone: string | null; };
end: { date: string | null; dateTime: string | null; timeZone: string | null; };
status: string | null;
htmlLink: string | null;
created: string | null;
updated: string | null;
description: string | null;
location: string | null;
colorId: string | null;
creator: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
organizer: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
recurrence: string[] | null;
recurringEventId: string | null;
originalStartTime: { date: string | null; dateTime: string | null; timeZone: string | null; } | null;
transparency: string | null;
visibility: string | null;
iCalUID: string | null;
sequence: number | null;
attendees: {
email: string;
id: string | null;
displayName: string | null;
organizer: boolean | null;
self: boolean | null;
resource: boolean | null;
optional: boolean | null;
responseStatus: string | null;
comment: string | null;
additionalGuests: number | null;
}[] | null;
attendeesOmitted: boolean | null;
guestsCanInviteOthers: boolean | null;
guestsCanModify: boolean | null;
guestsCanSeeOtherGuests: boolean | null;
hangoutLink: string | null;
conferenceData: object | null;
reminders: { useDefault: boolean; overrides: { method: string; minutes: number; }[] | null; } | null;
eventType: string | null;
};
after: {
id: string;
summary: string | null;
start: { date: string | null; dateTime: string | null; timeZone: string | null; };
end: { date: string | null; dateTime: string | null; timeZone: string | null; };
status: string | null;
htmlLink: string | null;
created: string | null;
updated: string | null;
description: string | null;
location: string | null;
colorId: string | null;
creator: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
organizer: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
recurrence: string[] | null;
recurringEventId: string | null;
originalStartTime: { date: string | null; dateTime: string | null; timeZone: string | null; } | null;
transparency: string | null;
visibility: string | null;
iCalUID: string | null;
sequence: number | null;
attendees: {
email: string;
id: string | null;
displayName: string | null;
organizer: boolean | null;
self: boolean | null;
resource: boolean | null;
optional: boolean | null;
responseStatus: string | null;
comment: string | null;
additionalGuests: number | null;
}[] | null;
attendeesOmitted: boolean | null;
guestsCanInviteOthers: boolean | null;
guestsCanModify: boolean | null;
guestsCanSeeOtherGuests: boolean | null;
hangoutLink: string | null;
conferenceData: object | null;
reminders: { useDefault: boolean; overrides: { method: string; minutes: number; }[] | null; } | null;
eventType: string | null;
};
}
add_attendees — Adicionar participantes a um evento
Adiciona novos participantes a um evento existente e envia a eles e-mails de convite. Ignora e-mails que já estão na lista de participantes.
Entradas:
- `event_id` (string, required) — ID of the event to add attendees to
- `attendee_emails` (list[string], required) — Email addresses to add as required attendees
- `calendar_id` (string, optional, default: "primary") — Calendar ID containing the event
- `send_updates` (string, optional, default: "all") — Who receives invitation emails: 'all', 'externalOnly', or 'none'
- `optional_attendees` (list[string], optional, default: []) — Email addresses to add as optional attendees. These are invited but their attendance is not required
Esquema de saída data:
{
before: {
id: string;
summary: string | null;
start: { date: string | null; dateTime: string | null; timeZone: string | null; };
end: { date: string | null; dateTime: string | null; timeZone: string | null; };
status: string | null;
htmlLink: string | null;
created: string | null;
updated: string | null;
description: string | null;
location: string | null;
colorId: string | null;
creator: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
organizer: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
recurrence: string[] | null;
recurringEventId: string | null;
originalStartTime: { date: string | null; dateTime: string | null; timeZone: string | null; } | null;
transparency: string | null;
visibility: string | null;
iCalUID: string | null;
sequence: number | null;
attendees: {
email: string;
id: string | null;
displayName: string | null;
organizer: boolean | null;
self: boolean | null;
resource: boolean | null;
optional: boolean | null;
responseStatus: string | null;
comment: string | null;
additionalGuests: number | null;
}[] | null;
attendeesOmitted: boolean | null;
guestsCanInviteOthers: boolean | null;
guestsCanModify: boolean | null;
guestsCanSeeOtherGuests: boolean | null;
hangoutLink: string | null;
conferenceData: object | null;
reminders: { useDefault: boolean; overrides: { method: string; minutes: number; }[] | null; } | null;
eventType: string | null;
};
after: {
id: string;
summary: string | null;
start: { date: string | null; dateTime: string | null; timeZone: string | null; };
end: { date: string | null; dateTime: string | null; timeZone: string | null; };
status: string | null;
htmlLink: string | null;
created: string | null;
updated: string | null;
description: string | null;
location: string | null;
colorId: string | null;
creator: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
organizer: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
recurrence: string[] | null;
recurringEventId: string | null;
originalStartTime: { date: string | null; dateTime: string | null; timeZone: string | null; } | null;
transparency: string | null;
visibility: string | null;
iCalUID: string | null;
sequence: number | null;
attendees: {
email: string;
id: string | null;
displayName: string | null;
organizer: boolean | null;
self: boolean | null;
resource: boolean | null;
optional: boolean | null;
responseStatus: string | null;
comment: string | null;
additionalGuests: number | null;
}[] | null;
attendeesOmitted: boolean | null;
guestsCanInviteOthers: boolean | null;
guestsCanModify: boolean | null;
guestsCanSeeOtherGuests: boolean | null;
hangoutLink: string | null;
conferenceData: object | null;
reminders: { useDefault: boolean; overrides: { method: string; minutes: number; }[] | null; } | null;
eventType: string | null;
};
}
Eventos — Exclusão
delete_event — Excluir permanentemente um evento
DESTRUTIVO — EXIGE CONFIRMAÇÃO EXPLÍCITA DO USUÁRIO ANTES DE CHAMAR. Exclui permanentemente um evento de calendário. Esta ação é irreversível: o evento, a lista de participantes, os lembretes e todos os dados associados são removidos imediatamente e não podem ser recuperados. Os participantes receberão e-mails de cancelamento (controlados por send_updates). Para eventos recorrentes: excluir o ID do evento mestre remove toda a série e todas as suas instâncias. Excluir um ID de instância específico remove apenas aquela ocorrência. NUNCA chame esta ferramenta de forma autônoma ou como parte de um fluxo automatizado. Você DEVE parar, informar ao usuário o título, a data e a hora do evento que será excluído permanentemente e, para eventos recorrentes, esclarecer se você está excluindo uma ocorrência ou a série inteira, e aguardar a confirmação escrita explícita antes de prosseguir.
Entradas:
- `event_id` (string, required) — ID of the event to delete
- `calendar_id` (string, optional, default: "primary") — Calendar ID containing the event
- `send_updates` (string, optional, default: "all") — Who receives cancellation emails: 'all' (recommended), 'externalOnly', or 'none'
Esquema de saída data:
{
message: string;
}
move_event — Mover um evento para outro calendário
DESTRUTIVO — EXIGE CONFIRMAÇÃO EXPLÍCITA DO USUÁRIO ANTES DE CHAMAR. Move um evento padrão de um calendário para outro. Apenas eventos do tipo 'default' podem ser movidos — eventos de aniversário, focusTime, fromGmail, outOfOffice e workingLocation não podem ser movidos e retornarão um erro. O evento é removido do calendário de origem e colocado no calendário de destino — quaisquer configurações específicas do calendário, permissões de compartilhamento ou regras de notificação da origem não se aplicarão mais. Embora seja tecnicamente reversível movendo de volta, isso pode interromper outros participantes e a visibilidade do calendário compartilhado de maneiras difíceis de rastrear. NUNCA chame esta ferramenta de forma autônoma. Você DEVE informar ao usuário qual evento está sendo movido, de qual calendário para qual, e aguardar a confirmação explícita.
Entradas:
- `event_id` (string, required) — ID of the event to move
- `source_calendar_id` (string, required) — ID of the calendar currently containing the event
- `destination_calendar_id` (string, required) — ID of the destination calendar
Esquema de saída data:
{
id: string;
summary: string | null;
start: { date: string | null; dateTime: string | null; timeZone: string | null; };
end: { date: string | null; dateTime: string | null; timeZone: string | null; };
status: string | null;
htmlLink: string | null;
created: string | null;
updated: string | null;
description: string | null;
location: string | null;
colorId: string | null;
creator: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
organizer: { id: string | null; email: string | null; displayName: string | null; self: boolean | null; } | null;
recurrence: string[] | null;
recurringEventId: string | null;
originalStartTime: { date: string | null; dateTime: string | null; timeZone: string | null; } | null;
transparency: string | null;
visibility: string | null;
iCalUID: string | null;
sequence: number | null;
attendees: {
email: string;
id: string | null;
displayName: string | null;
organizer: boolean | null;
self: boolean | null;
resource: boolean | null;
optional: boolean | null;
responseStatus: string | null;
comment: string | null;
additionalGuests: number | null;
}[] | null;
attendeesOmitted: boolean | null;
guestsCanInviteOthers: boolean | null;
guestsCanModify: boolean | null;
guestsCanSeeOtherGuests: boolean | null;
hangoutLink: string | null;
conferenceData: object | null;
reminders: { useDefault: boolean; overrides: { method: string; minutes: number; }[] | null; } | null;
eventType: string | null;
}
Calendários
list_calendars — Listar todos os calendários
Lista todos os calendários aos quais o usuário tem acesso. Retorna IDs de calendário, nomes, fusos horários, cores e funções de acesso. Use min_access_role para filtrar calendários em que o usuário pode editar.
Entradas:
- `min_access_role` (string, optional, default: "") — Minimum access role to filter by: 'freeBusyReader', 'reader', 'writer', or 'owner'. Empty returns all calendars
- `show_hidden` (bool, optional, default: false) — Include calendars hidden from the list view
- `max_results` (int, optional, default: 100) — Maximum number of calendars to return (1–250)
- `page_token` (string, optional, default: "") — Pagination token from a previous response's next_page_token to fetch the next page
Esquema de saída data:
{
count: number;
calendars: {
id: string;
summary: string;
description: string | null;
location: string | null;
timeZone: string | null;
accessRole: string | null;
backgroundColor: string | null;
foregroundColor: string | null;
selected: boolean | null;
primary: boolean | null;
hidden: boolean | null;
}[];
next_page_token: string | null;
}
get_calendar — Obter um único calendário
Obtém todos os detalhes de um calendário específico, incluindo nome, descrição, fuso horário e configurações de cores.
Entradas:
- `calendar_id` (string, optional, default: "primary") — Calendar ID. Use 'primary' for the user's main calendar
Esquema de saída data:
{
id: string;
summary: string;
description: string | null;
location: string | null;
timeZone: string | null;
accessRole: string | null;
backgroundColor: string | null;
foregroundColor: string | null;
selected: boolean | null;
primary: boolean | null;
hidden: boolean | null;
}
create_calendar — Criar um novo calendário
Cria um novo calendário de propriedade do usuário. Retorna o calendário criado com seu ID, necessário para todas as operações subsequentes nesse calendário.
Entradas:
- `summary` (string, required) — Name of the new calendar
- `description` (string, optional, default: "") — Optional description for the calendar
- `timezone` (string, optional, default: "UTC") — IANA timezone name for the calendar, e.g. 'America/New_York'
Esquema de saída data:
{
id: string;
summary: string;
description: string | null;
location: string | null;
timeZone: string | null;
accessRole: string | null;
backgroundColor: string | null;
foregroundColor: string | null;
selected: boolean | null;
primary: boolean | null;
hidden: boolean | null;
}
delete_calendar — Excluir permanentemente um calendário
DESTRUTIVO — EXIGE CONFIRMAÇÃO EXPLÍCITA DO USUÁRIO ANTES DE CHAMAR. Exclui permanentemente um calendário inteiro e todos os eventos que ele contém. Esta ação é irreversível: todos os eventos, séries recorrentes e histórico do calendário desaparecem imediatamente, sem possibilidade de recuperação. NUNCA chame esta ferramenta de forma autônoma ou como parte de um fluxo automatizado. Você DEVE parar, informar ao usuário exatamente qual calendário será excluído e que todos os seus eventos serão perdidos permanentemente, e aguardar a confirmação escrita explícita antes de prosseguir.
Entradas:
- `calendar_id` (string, required) — ID of the calendar to delete
Esquema de saída data:
{
message: string;
}
clear_calendar — Excluir todos os eventos de um calendário
DESTRUTIVO — EXIGE CONFIRMAÇÃO EXPLÍCITA DO USUÁRIO ANTES DE CHAMAR. Exclui permanentemente TODOS os eventos de um calendário sem excluir o próprio calendário. Esta ação é irreversível: todos os eventos do calendário — passados, presentes e futuros — são removidos imediatamente, sem possibilidade de recuperação. O calendário em si permanece e pode ser usado para novos eventos. Esta é a única forma de limpar o calendário principal, que não pode ser excluído. NUNCA chame esta ferramenta de forma autônoma ou como parte de um fluxo automatizado. Você DEVE parar, informar ao usuário exatamente qual calendário será limpo e que todos os eventos nele serão excluídos permanentemente, e aguardar a confirmação escrita explícita antes de prosseguir.
Entradas:
- `calendar_id` (string, required) — ID of the calendar to clear. Use 'primary' for the user's main calendar. WARNING: all events in this calendar will be permanently deleted
Esquema de saída data:
{
message: string;
}
Disponibilidade (Free/Busy)
get_free_busy — Consultar blocos de ocupação entre calendários
Retorna blocos de tempo ocupado para um ou mais calendários dentro de um intervalo de tempo. Use isso para descobrir quando alguém está disponível ou para agendar sem conflitos. Forneça time_min e time_max no formato ISO 8601 com fuso horário, por exemplo, '2026-01-08T09:00:00Z'. Retorna um mapa de ID do calendário → lista de blocos de tempo ocupado. Tempo livre = lacunas entre os blocos ocupados dentro do intervalo solicitado.
Entradas:
- `time_min` (string, required) — Start of the query window in ISO 8601 format, e.g. '2026-01-08T09:00:00Z'
- `time_max` (string, required) — End of the query window in ISO 8601 format, e.g. '2026-01-08T17:00:00Z'
- `calendar_ids` (list[string], optional, default: []) — Calendar IDs to query. Defaults to ['primary'] if empty
Esquema de saída data:
{
timeMin: string;
timeMax: string;
calendars: {
[calendarId: string]: {
busy: {
start: string;
end: string;
}[];
errors: object[] | null;
};
};
}
Referência de Parâmetros da API
Envelope de Resposta
Cada ferramenta retorna o mesmo envelope de nível superior. Apenas data varia por ferramenta.
// Success
{
success: true;
statusCode: number;
retriable: false;
retry_after_seconds: null;
error: null;
data: { ... }; // schema shown per tool above
}
// Error
{
success: false;
statusCode: number;
retriable: boolean;
retry_after_seconds: number | null;
error: {
code: string; // VALIDATION_ERROR | AUTH_ERROR | UPSTREAM_ERROR | SERVER_ERROR
message: string;
details: any;
};
data: null;
}
retriable—truequando é seguro tentar novamente (limite de taxa, erro de rede, 503).falsepara erros de validação e autenticação.retry_after_seconds— segundos para aguardar antes de tentar novamente; presente apenas quandoretriableétruee o upstream especifica um atraso.
Formatos de Data e Hora
Todas as ferramentas usam o formato ISO 8601 para valores de data e hora.
Eventos com horário:
YYYY-MM-DDTHH:MM:SS local time (requires timezone param)
YYYY-MM-DDTHH:MM:SSZ UTC
YYYY-MM-DDTHH:MM:SS±HH:MM explicit offset
Eventos de dia inteiro (use com is_all_day=true):
YYYY-MM-DD e.g. 2026-01-08
Para eventos de dia inteiro, end_time é exclusivo — um evento de um dia em 8 de janeiro precisa de end_time='2026-01-09'.
Regras de Recorrência (RRULE)
create_recurring_event requer uma string RRULE RFC 5545 começando com RRULE:.
RRULE:FREQ=DAILY;COUNT=5 — 5 daily occurrences
RRULE:FREQ=WEEKLY;BYDAY=MO,WE,FR — every Mon/Wed/Fri
RRULE:FREQ=MONTHLY;BYMONTHDAY=15 — 15th of each month
RRULE:FREQ=YEARLY — same date each year
RRULE:FREQ=WEEKLY;BYDAY=MO;UNTIL=20261231T000000Z — until a date
ID do Calendário
primary— o calendário principal do usuário no Google Calendar (sempre válido)- Todos os outros calendários usam um ID completo de
list_calendars, por exemplo,work@group.calendar.google.com
list_calendars retorna id para cada calendário ao qual o usuário tem acesso.
Paginação
list_events, search_events, list_event_instances e list_calendars suportam paginação via next_page_token.
Quando data.next_page_token não for nulo em uma resposta, passe-o como page_token na próxima chamada com os mesmos parâmetros para recuperar a próxima página.
Solução de Problemas
Cabeçalhos Ausentes ou Inválidos
- Causa: Token OAuth não fornecido nos cabeçalhos da solicitação ou formato incorreto
- Solução:
- Verifique se os cabeçalhos
Authorization: Bearer YOUR_TOKENeX-Mewcp-Credential-Id: CREDENTIAL-IDestão presentes - Verifique se o token OAuth não expirou — reconecte-se na sua conta MewCP se necessário
- Verifique se os cabeçalhos
Créditos Insuficientes
- Causa: As chamadas de API excederam seus limites de solicitação
- Solução:
- Verifique o uso de créditos no seu painel do Curious Layer
- Faça upgrade para um plano pago ou adicione créditos para limites maiores
- Entre em contato com o suporte para ajustes de crédito
Credencial Não Conectada
- Causa: Nenhuma credencial do Google Calendar vinculada à sua conta
- Solução:
- Vá para Credenciais no seu painel do MewCP
- Conecte sua conta do Google (OAuth)
- Tente novamente a solicitação com o cabeçalho
X-Mewcp-Credential-Idcorreto
Payload de Solicitação Malformado
- Causa: O payload JSON é inválido ou está faltando campos obrigatórios
- Solução:
- Valide a sintaxe JSON antes de enviar
- Garanta que todos os parâmetros obrigatórios da ferramenta estejam incluídos
- Verifique se os tipos de parâmetros correspondem aos valores esperados (por exemplo,
time_mindeve ser ISO 8601)
Servidor Não Encontrado
- Causa: Nome de servidor incorreto no endpoint da API
- Solução:
- Verifique o formato do endpoint:
{server-name}/mcp/{tool-name} - Use o nome de servidor correto da documentação
- Verifique os servidores disponíveis na sua conta do Curious Layer
- Verifique o formato do endpoint:
Erro da API do Google Calendar
- Causa: A API upstream do Google Calendar retornou um erro
- Solução:
- Verifique o Status do Google Workspace para problemas de serviço
- Verifique se sua conta do Google tem as permissões de calendário necessárias
- Revise a mensagem de erro na resposta para obter detalhes específicos
Recursos
- Documentação da API do Google Calendar — Referência oficial da API
- Referência de Eventos da API do Google Calendar — Referência completa do endpoint de eventos
- Documentação do FastMCP — Especificação do FastMCP
- Credenciais do FastMCP — Pacote de Credenciais do FastMCP para gerenciamento de credenciais