
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:00Claude Code はこの依頼を受け取ると、
list_calendarsで接続中アカウントから見えるカレンダー一覧を取得- 指定された 2 アカウントのカレンダーを特定(自分のカレンダー + 共有されているカレンダー)
- 各日付ごとに
list_eventsで予定を取得 - 終日「予定なし扱い(transparency=transparent)」のイベントを除外
- 12:00〜21:00 の枠から忙しい時間を引いた 空き時間スロット を計算
- 30 分以上のスロットだけ抽出し、上記フォーマットで整形
…という処理を一気にやってくれます。会議調整の Slack 返信が秒で生成できる のは想像以上に快適です。
全体構成
ポイントは以下の 3 つです。
- MCP サーバーは Google が提供する HTTPS エンドポイント。自前ホストは不要。
- Claude.ai の「カスタムコネクタ」が OAuth クライアント として振る舞う。
- Claude Code 側は
/mcpで認証を要求するだけ。Claude Code 自体に Google の秘密情報を持たない。
前提条件
実際に動かしたときの環境です。
- Google Cloud プロジェクト(無料で OK / 既存プロジェクトの流用可)
- Google アカウント(メイン認証用)
- Claude プラン: カスタムコネクタが利用可能なプラン(Pro / Team / Enterprise)
gcloudCLI(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.readonly | list_calendars(カレンダー一覧) |
https://www.googleapis.com/auth/calendar.events.readonly | list_events / get_event(予定の取得) |
https://www.googleapis.com/auth/calendar.events.freebusy | suggest_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.json4. Claude.ai にカスタムコネクタを登録
Claude.ai の設定画面で MCP コネクタを追加します。
URL:
https://claude.ai/settings/connectors「カスタムコネクタを追加」を選び、以下の値を入力します。
| 項目 | 値 |
|---|---|
| 名前 | Google Calendar (your-project-id) など分かりやすい名称 |
| MCP サーバー URL | https://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_event6. 動作確認
シンプルに list_calendars を呼ぶよう Claude Code に頼みます。
> 接続中のGoogle カレンダーの一覧を出して結果として、
- 自分のメインカレンダー
- ファミリーカレンダー(あれば)
- 祝日カレンダー
- 他アカウントから「設定と共有」で共有されているカレンダー
が一覧で返ってきたら成功です。
利用可能ツール一覧
calendarmcp.googleapis.com が提供するツールは以下のとおりです。
| ツール | 種別 | 説明 |
|---|---|---|
list_calendars | read | アクセス可能なカレンダー一覧 |
list_events | read | 期間指定で予定を取得(最大 250 件/ページ) |
get_event | read | 単一イベントの詳細 |
suggest_time | read | freebusy ベースの候補時間提案(最大 5 件) |
create_event | write | 予定の作成 |
update_event | write | 予定の更新 |
delete_event | write | 予定の削除 |
respond_to_event | write | 招待への応答 |
書き込み系(
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 週間分の空き時間を全部出して」のように 網羅的に列挙したい ケースでは、
list_eventsで対象期間の全予定を取得- Claude 側で各日付の
[12:00, 21:00]区間から busy 時間を引く - しきい値以上(例: 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 つだけ で行い、他のアカウントから そのメインアカウント宛にカレンダーを共有 してもらう方式です。
- 共有元アカウントで Google カレンダーを開く
- 対象カレンダーの 「設定と共有」 → 「特定のユーザーとの共有」 で、メイン認証アカウントを追加
- 権限は最低 「予定の表示(すべての予定の詳細)」
- 共有先で届く招待メールから 「このカレンダーを追加」 をクリック
- 次回の
list_calendarsで一覧に出てくる
メリット: 認可をやり直さなくていい / 全アカウントが 1 コネクタで管理できる。 デメリット: 共有元の協力が必要 / アカウントごとに招待を承認する作業が発生。
方式 B: 再認証方式(切り替え)
同じコネクタを 別アカウントで認可し直す 方式。
- Claude.ai のコネクタ設定で「切断」
- 再度「接続」を押す
- 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手順:
- OAuth 同意画面のスコープ に
calendar.eventsを追加して保存 - Claude.ai のコネクタを 「切断」
- もう一度 「接続」 → 再 OAuth 認可(追加スコープへの同意画面が出る)
- 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 分くらいで動かせるはずです。