Claude Code から Google カレンダーを操作する - Google Calendar MCP セットアップ完全ガイド

Claude Code から Google カレンダーを操作する - Google Calendar MCP セットアップ完全ガイド

作成日:
更新日:

「来週どこか 1 時間取れる?」と聞かれたとき、Google カレンダーを開いて、自分の予定を見て、相手の予定を見て、空き時間をリストアップして…という作業は地味に面倒です。これを Claude Code に丸投げできるようにする のが今回のテーマです。

Google が 2025 年に公開した公式 Calendar MCP サーバーcalendarmcp.googleapis.com)を、Claude.ai のカスタムコネクタとして登録すると、Claude Code のプロンプトから自分のカレンダー・共有カレンダーを横断的に検索・分析できるようになります。

この記事では、

  • Google Cloud プロジェクトでの OAuth 2.0 設定
  • Claude.ai でのカスタムコネクタ登録
  • Claude Code 側での /mcp 認証
  • 複数アカウントの空き時間検索という実用ユースケース
  • 一発で動かなかった「ハマりどころ」

までを、実際に動かしたログをベースに整理します。

何ができるようになるか

Claude Code のチャットから、自然言語でカレンダー操作ができるようになります。たとえば次のような依頼を投げると、Claude が list_calendars / list_events / suggest_time といった MCP ツールを自動で呼び出し、結果を表にまとめてくれます。

member-a@example.com と member-b@example.com のどちらも予定が空いている時間を調べて、
下記のような表記でミーティング候補日を出力したい。
平日: 12:00 〜 21:00 の間で、6/5 までとする。
 
・5/21 (木) 18:00-19:00
・5/27 (水) 14:00-18:00、14:00-15:00、16:00-18:00
・5/28 (木) 12:00-14:00
・5/29 (金) 14:00-17:00
  
・6/1 (月) 12:00-21:00
・6/2 (火) 12:00-14:00、15:00-17:00、19:00-21:00
・6/3 (水) 12:00-13:00、13:00-21:00
・6/4 (木) 12:00-14:00、15:00-21:00
・6/5 (金) 12:00-17:00

Claude Code はこの依頼を受け取ると、

  1. list_calendars で接続中アカウントから見えるカレンダー一覧を取得
  2. 指定された 2 アカウントのカレンダーを特定(自分のカレンダー + 共有されているカレンダー)
  3. 各日付ごとに list_events で予定を取得
  4. 終日「予定なし扱い(transparency=transparent)」のイベントを除外
  5. 12:00〜21:00 の枠から忙しい時間を引いた 空き時間スロット を計算
  6. 30 分以上のスロットだけ抽出し、上記フォーマットで整形

…という処理を一気にやってくれます。会議調整の Slack 返信が秒で生成できる のは想像以上に快適です。

全体構成

Loading diagram...

ポイントは以下の 3 つです。

  • MCP サーバーは Google が提供する HTTPS エンドポイント。自前ホストは不要。
  • Claude.ai の「カスタムコネクタ」が OAuth クライアント として振る舞う。
  • Claude Code 側は /mcp で認証を要求するだけ。Claude Code 自体に Google の秘密情報を持たない。

前提条件

実際に動かしたときの環境です。

  • Google Cloud プロジェクト(無料で OK / 既存プロジェクトの流用可)
  • Google アカウント(メイン認証用)
  • Claude プラン: カスタムコネクタが利用可能なプラン(Pro / Team / Enterprise)
  • gcloud CLI(GUI でも完結しますが、本記事の検証は CLI で実施)
  • OAuth クライアント JSON の保存先(パスワードマネージャ / 1Password / 暗号化フォルダ等)

gcloud が未導入なら次でインストールできます。

brew install --cask google-cloud-sdk
gcloud init

セットアップ手順

1. Google Cloud API の有効化

Calendar MCP は calendarmcp.googleapis.com という 独立した API として提供されています。calendar-json.googleapis.com(Calendar API 本体)と両方を有効化します。

# 必要に応じてプロジェクトを指定
export GCP_PROJECT=your-project-id
 
gcloud services enable calendar-json.googleapis.com --project=$GCP_PROJECT
gcloud services enable calendarmcp.googleapis.com --project=$GCP_PROJECT

確認:

gcloud services list --enabled --project=$GCP_PROJECT \
  --filter="NAME:(calendar-json.googleapis.com OR calendarmcp.googleapis.com)"

両方が ENABLED と出ていれば OK です。

2. OAuth 同意画面にスコープを追加

Google Cloud Console の 「APIs & Services」→「OAuth 同意画面」→「データアクセス」 で、Calendar 系のスコープを追加します。

URL(プロジェクト ID を置き換えて使用):

https://console.cloud.google.com/auth/scopes?project=your-project-id

最低限、以下の 読み取り専用スコープ 3 つ を追加します。

スコープ用途
https://www.googleapis.com/auth/calendar.calendarlist.readonlylist_calendars(カレンダー一覧)
https://www.googleapis.com/auth/calendar.events.readonlylist_events / get_event(予定の取得)
https://www.googleapis.com/auth/calendar.events.freebusysuggest_time(freebusy ベースの候補時間)

書き込み(予定の作成・更新・削除)が必要になった場合は、後述する通り https://www.googleapis.com/auth/calendar.events を追加して 再認証 が必要です。最初は読み取りだけで十分なので、欲張らないことをおすすめします。

テストユーザーの追加(外部ユーザータイプの場合) 同意画面のユーザータイプが「外部」かつ「テスト中」のときは、OAuth 認可するメールアドレスを「テストユーザー」一覧に追加 しておかないと、認可時に弾かれます。自分以外のアカウントで認可するときは要注意。

3. OAuth クライアントにリダイレクト URI を追加

同じく Google Cloud Console の 「APIs & Services」→「認証情報」 で、ウェブアプリケーション型の OAuth 2.0 クライアント ID を用意します(既存のものを流用しても OK)。

URL:

https://console.cloud.google.com/auth/clients?project=your-project-id

該当クライアントを開き、「承認済みのリダイレクト URI」 に以下の 1 行を追加します。

https://claude.ai/api/mcp/auth_callback

既存のリダイレクト URI(自分のサービス用のもの)はそのまま残して構いません。Claude 用のコールバック URI が追加されているだけで動作します。

クライアント ID とクライアントシークレットは後で使うので、「JSON をダウンロード」 で保存しておきます。保存先はパスワードマネージャや暗号化フォルダなど、安全な場所にしておきましょう。

client_secret_<CLIENT_ID>.apps.googleusercontent.com.json

4. Claude.ai にカスタムコネクタを登録

Claude.ai の設定画面で MCP コネクタを追加します。

URL:

https://claude.ai/settings/connectors

「カスタムコネクタを追加」を選び、以下の値を入力します。

項目
名前Google Calendar (your-project-id) など分かりやすい名称
MCP サーバー URLhttps://calendarmcp.googleapis.com/mcp/v1
OAuth クライアント ID手順 3 で取得した <CLIENT_ID>.apps.googleusercontent.com
OAuth クライアントシークレット同 JSON の client_secret

MCP サーバー URL はアカウントを問わず共通です。ここが「ハマりどころ A」につながります(後述)。

5. Claude Code から /mcp で認証

Claude Code(Desktop または CLI)を起動し、プロンプトで:

/mcp

を実行すると、登録済み MCP コネクタの一覧が出ます。先ほど登録した Google Calendar (your-project-id) を選択すると、ブラウザが開き OAuth 認可画面に遷移します。

ここで、

  • 認可するアカウントを選ぶ(前回ログインしたアカウントが自動選択 されているので注意)
  • 「このアプリは確認されていません」警告が出たら、「詳細」→「Calendar MCP Server に移動(安全ではないページ)」で進める(同意画面がテスト中の場合に出るだけで、自作プロジェクトを使う限り問題ない)
  • 要求されたスコープに同意

を済ませると、Claude Code 側で以下のようなツール群が利用可能になります。

mcp__claude_ai_Google_Calendar_<connector_name>__list_calendars
mcp__claude_ai_Google_Calendar_<connector_name>__list_events
mcp__claude_ai_Google_Calendar_<connector_name>__get_event
mcp__claude_ai_Google_Calendar_<connector_name>__suggest_time
mcp__claude_ai_Google_Calendar_<connector_name>__create_event
mcp__claude_ai_Google_Calendar_<connector_name>__update_event
mcp__claude_ai_Google_Calendar_<connector_name>__delete_event
mcp__claude_ai_Google_Calendar_<connector_name>__respond_to_event

6. 動作確認

シンプルに list_calendars を呼ぶよう Claude Code に頼みます。

> 接続中のGoogle カレンダーの一覧を出して

結果として、

  • 自分のメインカレンダー
  • ファミリーカレンダー(あれば)
  • 祝日カレンダー
  • 他アカウントから「設定と共有」で共有されているカレンダー

が一覧で返ってきたら成功です。

利用可能ツール一覧

calendarmcp.googleapis.com が提供するツールは以下のとおりです。

ツール種別説明
list_calendarsreadアクセス可能なカレンダー一覧
list_eventsread期間指定で予定を取得(最大 250 件/ページ)
get_eventread単一イベントの詳細
suggest_timereadfreebusy ベースの候補時間提案(最大 5 件
create_eventwrite予定の作成
update_eventwrite予定の更新
delete_eventwrite予定の削除
respond_to_eventwrite招待への応答

書き込み系(create_event 以下)は手順 2 で calendar.events スコープを追加していないと 403 になります。読み取り中心の運用なら追加しないほうが安全 です。

実用ユースケース: 複数アカウントの空き時間検索

冒頭で挙げたユースケースを、もう少し深く掘り下げます。

Claude Code に投げるプロンプト例

member-a@example.com と member-b@example.com の両方が空いている時間を、
平日 12:00〜21:00 の範囲で、本日から 2 週間先まで列挙してください。
30 分以上空いているスロットだけでよいです。
 
出力フォーマット:
・M/D (曜) HH:MM-HH:MM、HH:MM-HH:MM, ...
 
休日(土・日・祝)は省略してください。

suggest_time ではなく list_events を使うのがコツ

ツール一覧にある suggest_time は freebusy 情報を元に候補時間を返してくれる便利な機能ですが、1 回の呼び出しで最大 5 件しか返らない 仕様です。

「2 週間分の空き時間を全部出して」のように 網羅的に列挙したい ケースでは、

  1. list_events で対象期間の全予定を取得
  2. Claude 側で各日付の [12:00, 21:00] 区間から busy 時間を引く
  3. しきい値以上(例: 30 分以上)のスロットだけ残す

という流れを Claude に明示的に指示するほうが確実です。プロンプトの末尾に「suggest_time ではなく list_events を使って、空き時間を自分で計算してください」と添えると、Claude が素直に従ってくれます。

終日「transparent」イベントの扱い

Google カレンダーには、終日イベントを 「予定あり」にしない(transparency: transparent) という設定があります。「ゴルフ?」のような不確定枠でよく使われるアレです。

空き時間計算をするとき、transparent な終日イベントは busy 扱いから除外する ように Claude に伝えておくと、より使いやすい候補が出てきます。プロンプト例:

終日イベントのうち、transparency が transparent のものは「予定なし」と扱ってください。

複数アカウントを束ねる 2 つの方式

ここがこの仕組みで一番悩むポイントです。Claude.ai のカスタムコネクタは 「MCP サーバー URL」単位 で管理されるため、https://calendarmcp.googleapis.com/mcp/v1 のコネクタは 1 アカウント分しか登録できません。同じ URL で別のコネクタを作ろうとすると、

A server with this URL already exists.

で弾かれます。複数の Google アカウントのカレンダーを横断的に扱うには、次の 2 方式から選ぶことになります。

方式 A: カレンダー共有方式(推奨)

OAuth 認可は メインアカウント 1 つだけ で行い、他のアカウントから そのメインアカウント宛にカレンダーを共有 してもらう方式です。

  1. 共有元アカウントで Google カレンダーを開く
  2. 対象カレンダーの 「設定と共有」「特定のユーザーとの共有」 で、メイン認証アカウントを追加
  3. 権限は最低 「予定の表示(すべての予定の詳細)」
  4. 共有先で届く招待メールから 「このカレンダーを追加」 をクリック
  5. 次回の list_calendars で一覧に出てくる

メリット: 認可をやり直さなくていい / 全アカウントが 1 コネクタで管理できる。 デメリット: 共有元の協力が必要 / アカウントごとに招待を承認する作業が発生。

方式 B: 再認証方式(切り替え)

同じコネクタを 別アカウントで認可し直す 方式。

  1. Claude.ai のコネクタ設定で「切断」
  2. 再度「接続」を押す
  3. OAuth 画面で 「別のアカウントを使用」 を選び、別アカウントで認可

メリット: 共有設定が不要。 デメリット: 元のアカウントの接続は失われる。アカウントを行き来する運用には不向き。

実運用では 方式 A 一択 だと思います。1 つのアカウントを「カレンダー集約点」にしておき、家族・チーム・別屋号のカレンダーをすべて共有してもらう構成にすると、Claude Code から見たときの体験がとても良くなります。

ハマったポイントと対処

A. MCP サーバー URL は全アカウント共通

すでに触れた通り。A server with this URL already exists. が出たら、上の 方式 A / B を検討してください。

B. API キー認証では接続できない

Google Maps Platform 等で使う API キー は Calendar MCP では使えません。OAuth 2.0 認可コードフロー一択 です。ここを誤解して API キーを設定しようとしてハマる、というのはありがちなパターン。

C. 「このアプリは確認されていません」警告

OAuth 同意画面が「テスト中」の場合に出ます。自作プロジェクトを自分が使う分には問題ないので、

詳細 → Calendar MCP Server に移動(安全ではないページ)

で進めて OK。チーム展開する場合は、Google による アプリ検証申請 が必要になります。

D. 終日イベントを busy にしたくない場合

前述の通り、transparency が transparent な終日イベントは busy 計算から除外 するよう Claude に伝えるのが鉄板です。プロンプト内で 1 行明記するだけで、出力品質が一段上がります。

E. 書き込みを追加するなら「再認可」が必要

最初に読み取り専用スコープで認可した後で calendar.events(書き込み)スコープを追加すると、コネクタを切断 → 再接続 しないと新しいスコープが認可されません。create_event を実行しようとして 403 PERMISSION_DENIED が返ってきたら、これを疑ってください。

書き込み(予定作成)を有効にする場合

業務効率化として「Claude Code に予定を作らせる」までやりたいなら、以下のスコープを追加します。

https://www.googleapis.com/auth/calendar.events

手順:

  1. OAuth 同意画面のスコープcalendar.events を追加して保存
  2. Claude.ai のコネクタを 「切断」
  3. もう一度 「接続」 → 再 OAuth 認可(追加スコープへの同意画面が出る)
  4. Claude Code を再起動 → /mcp で再認証

これで create_event / update_event / delete_event / respond_to_event が使えるようになります。

書き込みはレビュー前提に 「来週金曜の 15-16 時に MTG を入れて」のような曖昧な依頼でも Claude は素直にイベントを作ってしまうので、作成前に確認する運用ルール にしておくのがおすすめです。Claude Code の「ツール実行の都度確認」設定を ON にしておくと安全です。

まとめ

  • Google 公式の Calendar MCP(calendarmcp.googleapis.com を使えば、Claude Code から Google カレンダーを横断的に扱える
  • 初期セットアップは「Cloud で API 有効化 → 同意画面でスコープ追加 → クライアントにリダイレクト URI 追加 → Claude.ai でコネクタ登録 → Claude Code で /mcp 認証」の 5 ステップ
  • 複数アカウントを束ねるなら 「カレンダー共有方式」 が圧倒的に運用しやすい
  • 「網羅的な空き時間検索」は suggest_time ではなく list_events ベースで Claude に計算させると失敗しにくい
  • 書き込み系を使うなら スコープ追加 → 切断 → 再接続 の再認可が必須

「会議調整に何分かかってますか?」を 数秒に圧縮 できるので、定期的に予定調整が発生する人ほど効果が高いです。OAuth 周りで一度ハマるとつらいですが、本記事の手順とハマりどころメモを片手にやれば、初回 30 分くらいで動かせるはずです。

参考リンク