mewcp-google-calendar について
mewcp-google-calendarは、AIワークフローからGoogle Calendarの予定やカレンダーを管理するMCPサーバーです。予定の検索と作成、繰り返し予定、参加者管理、空き時間の確認に対応します。
主な機能
- 01予定の一覧表示、検索、取得
- 02日時指定、終日、繰り返し予定の作成
- 03予定の更新と参加者の管理
- 04複数カレンダーの空き時間を確認
- 05今後および当日の予定を照会
活用シーン
- 01AIワークフローで会議を設定・変更
- 02テキストと期間を指定して予定を検索
- 03参加者への招待や定例会議を調整
- 04複数カレンダーから空き時間を探す
MCP 対応
Google Calendar APIの操作をMCPクライアント向けのツールとして提供し、予定やカレンダーの管理、空き時間の確認、予定の作成に対応します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
予定をよりスマートに管理 — AI を通じて Google Calendar の予定を作成、検索、管理できます。
予定やカレンダーの作成、読み取り、更新、削除を行う Google Calendar API を公開する Model Context Protocol(MCP)サーバーです。
概要
Google Calendar MCP Server を使うと、AI ワークフローから直接、カレンダーを総合的に管理できます。
- 時間範囲、テキスト、繰り返しに基づく詳細なフィルタリングで、予定を一覧表示、検索、取得できます
- 参加者、リマインダー、Meet リンクを設定して、単発、終日、簡易、繰り返しの予定を作成できます
- 予定を更新し、参加者を管理して、変更前後の状態を 1 つのレスポンスで取得できます
- 複数のカレンダーの空き時間情報を照会し、予定が重ならない空き時間を検索できます
次の用途に最適です。
- ユーザーに代わって会議の予定を設定、変更、管理する AI アシスタント
- カレンダーの状態を読み取り、時間に基づくアクションを実行するワークフロー自動化
- チーム間の空き状況を調整し、招待を送信するエージェント
ツール
予定 — 読み取り
list_events — カレンダーの予定を一覧表示
任意の時間範囲を指定して、カレンダーの予定を一覧表示します。予定は開始時刻順に返されます。繰り返しの予定は個々のインスタンスに展開されます。time_min/time_max には ISO 8601 形式を使用してください('YYYY-MM-DDTHH:MM:SSZ'、例:'2026-01-08T00:00:00Z')。time_min を指定しない場合は、現在以降の予定がデフォルトで返されます。
入力:
- `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
出力 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 — ID で単一の予定を取得
参加者、RSVP のステータス、繰り返しルール、リマインダー、会議情報など、指定した予定の詳細を取得します。
入力:
- `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
出力 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 — テキストで予定を検索
タイトル、説明、場所を対象にテキストで予定を検索します。time_min/time_max(ISO 8601 形式、例:'2026-01-08T00:00:00Z')を使って、検索を時間範囲に限定することもできます。時間範囲を指定しない場合は、過去のすべての履歴が検索対象になります。カレンダーの予定が多い場合は、必ず時間範囲を指定してください。
入力:
- `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
出力 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 — 今後 N 日間の予定を取得
現在から今後 N 日間に開始する予定を取得します。予定は開始時刻順に返されます。繰り返しの予定は個々のインスタンスに展開されます。
入力:
- `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)
出力 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 — 今日のすべての予定を取得
指定したタイムゾーンで今日予定されているすべての予定を取得します。正しい日付の予定を取得するには、ユーザーのローカルタイムゾーンを渡してください(例:'America/New_York')。デフォルトは UTC です。
入力:
- `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
出力 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 — 繰り返し予定のインスタンスを一覧表示
マスター予定 ID を指定して、繰り返し予定の個々のインスタンスをすべて一覧表示します。繰り返し予定の各回を確認するには、このツールを使用してください。まず get_event または list_events でマスター予定 ID を確認してください。インスタンスには recurringEventId(マスター ID)と originalStartTime(RRULE に基づく予定時刻。インスタンスが再設定されている場合は start と異なります)が含まれます。時間範囲で絞り込み、今後または過去の予定のみを表示することもできます。
入力:
- `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
出力 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;
}
create_event — 新しいカレンダーイベントを作成
新しいカレンダーイベントを作成し、必要に応じて参加者を招待します。時間指定のイベントには、タイムゾーンを含む ISO 8601 形式の日時('2026-01-08T14:30:00')を使用します。終日イベントの場合は is_all_day=True に設定し、日付のみの形式('2026-01-08')を使用します。終日イベントでは end_time は排他的なため、1 月 8 日の 1 日限りのイベントには end_time='2026-01-09' が必要です。作成されたイベントとその ID を返します。
入力:
- `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
出力 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 — 自然言語からイベントを作成
自然言語によるテキストの説明からイベントを作成します。Google Calendar がテキストを解析して、タイトル、日付、時刻、繰り返しを抽出します。例:「明日の正午に Sarah とランチ」「毎週月曜日の午前 9 時にチームの朝会」。作成されたイベントを返します。参加者やカスタムフィールドを含む複雑なイベントには、代わりに create_event を使用してください。
入力:
- `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'
出力 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 — RRULE を使用して繰り返しイベントを作成
RRULE の繰り返しパターンを使用して、繰り返しのカレンダーイベントを作成します。recurrence_rule は「RRULE:」で始まり、その後に RFC 5545 のパラメーターを続ける必要があります。例:「RRULE:FREQ=DAILY;COUNT=5」「RRULE:FREQ=WEEKLY;BYDAY=MO,WE,FR」「RRULE:FREQ=MONTHLY;BYMONTHDAY=15」「RRULE:FREQ=YEARLY」。繰り返しイベントのマスターを返します。個々のインスタンスは Google Calendar によって展開されます。
入力:
- `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
出力 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 — 既存のイベントを更新
既存のカレンダーイベントを更新します。指定したフィールドのみが変更されます。現在の値を維持するには、フィールドを空のままにしてください。最初に現在のイベントを取得し、変更を適用してから保存します。時刻には ISO 8601 形式「YYYY-MM-DDTHH:MM:SS」を使用してください。繰り返しイベントの場合、すべてのインスタンスを変更するにはマスターイベント ID を渡し、特定の発生分のみを変更するには個別のインスタンス ID を渡してください。警告:シリーズ全体を変更するために個々のインスタンスを 1 件ずつ更新しないでください。代わりにマスターイベントを更新してください。インスタンスを個別に変更すると例外が作成され、カレンダーが煩雑になり、過剰な通知が発生します。シリーズの残りに影響を与えずに単一のインスタンスをキャンセルするには、status='cancelled' に設定してください。
入力:
- `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
出力 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 — イベントに参加者を追加
既存のイベントに新しい参加者を追加し、招待メールを送信します。すでに参加者リストにあるメールアドレスはスキップします。
入力:
- `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
出力 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;
};
}
delete_event — イベントを完全に削除する
破壊的な操作 — 呼び出す前にユーザーの明示的な確認が必要です。カレンダーのイベントを完全に削除します。この操作は元に戻せません。イベント、参加者リスト、リマインダー、および関連するすべてのデータが直ちに削除され、復元できなくなります。参加者にはキャンセルメールが送信されます(send_updates によって制御されます)。繰り返しイベントの場合、マスターイベント ID を削除すると、シリーズ全体とすべての予定が削除されます。特定の予定の ID を削除すると、その回のみが削除されます。このツールを自律的に、または自動化されたフローの一部として呼び出してはなりません。必ず中断し、完全に削除されるイベントのタイトル、日付、時刻をユーザーに伝えてください。繰り返しイベントの場合は、1 回分のみを削除するのかシリーズ全体を削除するのかを明確にし、続行する前にユーザーから明示的な書面による確認を待ってください。
入力:
- `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'
出力 data のスキーマ:
{
message: string;
}
move_event — イベントを別のカレンダーに移動する
破壊的な操作 — 呼び出す前にユーザーの明示的な確認が必要です。デフォルトのイベントを、あるカレンダーから別のカレンダーに移動します。移動できるのはタイプが 'default' のイベントのみです。birthday、focusTime、fromGmail、outOfOffice、workingLocation のイベントは移動できず、エラーが返されます。イベントは移動元のカレンダーから削除され、移動先のカレンダーに追加されます。そのため、移動元のカレンダー固有の設定、共有権限、通知ルールは適用されなくなります。技術的には元のカレンダーに戻すことで取り消せますが、ほかの参加者や共有カレンダーの表示に影響が生じ、原因を特定しにくくなる場合があります。このツールを自律的に呼び出してはなりません。必ず、移動するイベントと移動元・移動先のカレンダーをユーザーに伝え、明示的な確認を待ってください。
入力:
- `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
出力 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;
}
list_calendars — すべてのカレンダーを一覧表示
ユーザーがアクセスできるすべてのカレンダーを一覧表示します。カレンダー ID、名前、タイムゾーン、色、アクセス権限を返します。ユーザーが書き込み可能なカレンダーに絞り込むには、min_access_role を使用します。
入力:
- `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
出力 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 — 単一のカレンダーを取得
特定のカレンダーの名前、説明、タイムゾーン、色の設定など、詳細情報を取得します。
入力:
- `calendar_id` (string, optional, default: "primary") — Calendar ID. Use 'primary' for the user's main calendar
出力 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 — 新しいカレンダーを作成
ユーザーが所有する新しいカレンダーを作成します。作成されたカレンダーとその ID を返します。この ID は、そのカレンダーに対する以降のすべての操作で必要になります。
入力:
- `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'
出力 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 — カレンダーを完全に削除
破壊的な操作です。呼び出す前にユーザーの明示的な確認が必要です。カレンダー全体と、その中に含まれるすべての予定を完全に削除します。この操作は取り消せません。カレンダー内のすべての予定、繰り返しの予定、履歴が直ちに消去され、復元する方法はありません。このツールを自律的に、または自動化されたフローの一部として呼び出してはいけません。必ず処理を中断し、削除されるカレンダーと、そのすべての予定が完全に失われることをユーザーに正確に伝え、続行する前にユーザーから明示的な書面による確認を得てください。
入力:
- `calendar_id` (string, required) — ID of the calendar to delete
出力 data のスキーマ:
{
message: string;
}
clear_calendar — カレンダーからすべての予定を削除
破壊的な操作です。呼び出す前にユーザーの明示的な確認が必要です。カレンダー自体は削除せず、そのカレンダーからすべての予定を完全に削除します。この操作は取り消せません。過去、現在、未来を問わず、カレンダー内のすべての予定が直ちに削除され、復元する方法はありません。カレンダー自体は残り、新しい予定に使用できます。削除できないプライマリカレンダーを空にする唯一の方法です。このツールを自律的に、または自動化されたフローの一部として呼び出してはいけません。必ず処理を中断し、空にするカレンダーと、その中のすべての予定が完全に削除されることをユーザーに正確に伝え、続行する前にユーザーから明示的な書面による確認を得てください。
入力:
- `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
出力 data のスキーマ:
{
message: string;
}
空き時間/予定あり
get_free_busy — カレンダー全体の予定あり時間帯を照会
指定した期間内における、1 つ以上のカレンダーの予定あり時間帯を返します。誰かの空き時間を確認したり、予定が重ならないようにスケジュールを組んだりする際に使用します。time_min と time_max は、タイムゾーンを含む ISO 8601 形式で指定します(例:'2026-01-08T09:00:00Z')。カレンダー ID をキー、予定あり時間帯のリストを値とするマップを返します。空き時間は、指定した期間内の予定あり時間帯の間の時間です。
入力:
- `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
出力 data のスキーマ:
{
timeMin: string;
timeMax: string;
calendars: {
[calendarId: string]: {
busy: {
start: string;
end: string;
}[];
errors: object[] | null;
};
};
}
レスポンスエンベロープ
すべてのツールは同じトップレベルのエンベロープを返します。ツールごとに異なるのは data のみです。
// 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— レート制限、ネットワークエラー、503 の場合など、安全に再試行できるときはtrueです。検証エラーや認証エラーの場合はfalseです。retry_after_seconds— 再試行までの待機秒数です。retriableがtrueで、上流が待機時間を指定している場合にのみ含まれます。
日付と時刻の形式
すべてのツールでは、日付と時刻の値に ISO 8601 形式を使用します。
時刻指定のイベント:
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
終日イベント(is_all_day=true と併用):
YYYY-MM-DD e.g. 2026-01-08
終日イベントの場合、end_time は排他的です。1 月 8 日の単日イベントには、end_time='2026-01-09' を指定する必要があります。
繰り返しルール(RRULE)
create_recurring_event には、RRULE: で始まる RFC 5545 の 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
primary— ユーザーのメインの Google Calendar(常に有効です)- それ以外のカレンダーには、
list_calendarsから取得した完全な ID を使用します。例:[email protected]
list_calendars は、ユーザーがアクセスできるすべてのカレンダーの id を返します。
ページネーション
list_events、search_events、list_event_instances、list_calendars は、next_page_token によるページネーションをサポートしています。
レスポンスの data.next_page_token が null 以外の場合、同じパラメーターを指定して次の呼び出しの page_token に渡すと、次のページを取得できます。
ヘッダーの欠落または無効
- 原因: リクエストヘッダーに OAuth トークンが指定されていないか、形式が正しくありません
- 解決策:
Authorization: Bearer YOUR_TOKENとX-Mewcp-Credential-Id: CREDENTIAL-IDヘッダーが設定されていることを確認します- OAuth トークンの有効期限が切れていないことを確認します。必要に応じて、MewCP アカウントで再接続してください
クレジット不足
- 原因: API 呼び出しがリクエスト上限を超えています
- 解決策:
- Curious Layer ダッシュボードでクレジットの使用状況を確認します
- より高い上限を利用するには、有料プランにアップグレードするか、クレジットを追加します
- クレジットの調整については、サポートにお問い合わせください
認証情報が接続されていません
- 原因: アカウントに Google Calendar の認証情報がリンクされていません
- 解決策:
- MewCP ダッシュボードの Credentials に移動します
- Google アカウントを接続します(OAuth)
- 正しい
X-Mewcp-Credential-Idヘッダーを付けて、リクエストを再試行します
リクエストペイロードの形式が不正です
- 原因: JSON ペイロードが無効であるか、必須フィールドが不足しています
- 解決策:
- 送信前に JSON の構文を検証します
- 必須のツールパラメーターがすべて含まれていることを確認します
- パラメーターの型が想定される値と一致していることを確認します(例:
time_minは ISO 8601 形式である必要があります)
サーバーが見つかりません
- 原因: API エンドポイントのサーバー名が正しくありません
- 解決策:
- エンドポイントの形式を確認します:
{server-name}/mcp/{tool-name} - ドキュメントに記載されている正しいサーバー名を使用します
- Curious Layer アカウントで利用可能なサーバーを確認します
- エンドポイントの形式を確認します:
Google Calendar API エラー
- 原因: 上流の Google Calendar API がエラーを返しました
- 解決策:
- サービスに問題がないか、Google Workspace のステータスを確認します
- Google アカウントに必要なカレンダーの権限があることを確認します
- 詳細を確認するには、レスポンスのエラーメッセージを確認します
リソース
- Google Calendar API ドキュメント — 公式 API リファレンス
- Google Calendar API Events リファレンス — events エンドポイントの完全なリファレンス
- FastMCP ドキュメント — FastMCP の仕様
- FastMCP Credentials — 認証情報を扱うための FastMCP Credentials パッケージ
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。