AIじゃないよ

カスタムGPTs完全ガイド:GoogleカレンダーAPIを実装した秘書GPTの作り方

当サイトはアフィリエイト広告を一部掲載しています。

「GPTs」は、ChatGPTのカスタムバージョンを、誰でも作成することのできる機能だ。
特定のタスクやトピックに特化したChatGPTを、プログラミングなしで容易に作成することができる。

外部のAPIを組み込むことも可能で、Googleカレンダーなどのタスク管理ツールや、最新の株価情報など外部のデータやアプリ等と、高性能な言語モデルであるChatGPTを連携させることができ、その拡張性は無限大である。

この記事では、カスタムGPT作成のチュートリアルとして、GoogleカレンダーのAPIをGPTに実装して、スケジュールを管理してくれるパーソナル秘書GPTを作成する。

APIドキュメントを、GPT作成時に必要となるOpenAPI Specificationに変換する方法も解説し、付録としてGoogleカレンダーAPIのOpenAPI Specificationも公開している。

このチュートリアルは、GoogleカレンダーAPI以外にも、外部のAPIをカスタムGPTに実装する手順として応用できるので、ぜひ参考にしてほしい。



オリジナル「GPT」の作り方の基本

カスタムGPTを作成できるのは、月額20ドルのChatGPT Plusに加入しているユーザーだ。

ChatGPT Plusにさえ入っていれば、カスタムGPTは無料で作成できるので、追加費用はかからずに、特定のタスクやトピックに特化したChatGPTを利用できる。

ChatGPTを開き、左側のメニューの「Explore」を開くと、OpenAIが公開しているGPTの一覧などを見ることができるが、「Create a GPT」をクリックすることで、自分だけのオリジナルカスタムGPTを作成することができる。

GPTの作成画面は、想像以上にシンプルで、「GPT Builder」というAIと会話しているだけでも、シンプルなカスタムGPTであれば作成することができてしまう。

例えば、常に語尾が「にゃー」という猫のキャラクターのGPTを作りたい、などと「GPT Builder」に相談すると、サクサクとカスタムGPTが作れてしまう。

GPTの作成画面では、「Create」タブと「Configure」タブがある。

それぞれの使い方を簡単に解説していく。

「Create」モードで会話しながらGPTを作る

「Create」タブでは、GPT BuilderというAIとの対話を通じて、カスタムGPTの設定を進めていくことができる。

例えば、カスタムGPTのためのアイコン画像を作成するように頼んでみた結果が以下だ。

Googleカレンダーの予定を閲覧・作成・削除するための「Calendar GPT」を作りたいから、そのアイコン画像を作成してくれと頼むと、色々と提案してくれた。

最初に提案された画像がサイケデリックすぎたので、「フラットでミニマリストなカレンダーアイコンにしてくれ」と頼んだところ、いい感じのアイコンが作成された。

このようなシンプルな設定は、インタラクティブな「Create」タブでサクサク進めていくことができる。

「Configure」モードでGPTを作り込む

外部APIを利用する場合など、細かく自分でカスタムGPTの設定を進めたい場合には、主に「Configure」タブを使うことになる。

ちなみに、「Create」タブは一切使わずに、「Configure」タブだけでカスタムGPTの作成を進めることもできる。
筆者の場合、仕様をフルコントロールして全て自力で決めたいので、アイコン画像以外は「Configure」タブで作業を進めていく。

GPTの「Configure」タブの構成は以下のようになっている。

  • Name:作成するカスタムGPTの名前。今回は、シンプルに「Calendar GPT」とする。
  • Description:作成するカスタムGPTの説明文。第三者にも公開する場合は重要だが、自分だけで使う場合は簡単で良い。
  • Instructions:作成するカスタムGPTが、どのような機能、振る舞いをするのかを具体的に指示する。
  • Conversation starters:ショートカットとして登録できる定型文。このカスタムGPTでよく使うプロンプトを登録しておくと便利。
  • Knowledge:ファイルをアップロードすることで、そのファイルの中身を踏まえた回答をしてくれるようになる。
  • Capabilities:ChatGPT Plusに備わっている各種の機能を、今回作成するカスタムGPTにも反映するかどうかを選択できる。
    • Web Browsing:Bingを使ったWeb検索の機能
    • DALL·E Image Generation:画像生成モデルのDALL-E 3による画像生成
    • Code Interpreter:GPT自身がPythonコードを実行できる機能
  • Actions:外部のAPI(GoogleカレンダーAPIなど)をGPTが使えるように登録できる。

最も重要な設定項目は、カスタムGPTの基本動作を左右する「Instructions」と、ファイルをアップロードして簡単にRAGが構築できる「Knowledge」、そして外部のAPIなども呼び出せるようになる「Actions」の3つが中心になるだろう。

「Knowledge」については、例えば書籍のPDFファイルを丸ごとアップロードすれば、その書籍の知識をフル活用して回答してくれるGPTが出来上がる。
学習中のプログラミング言語の書籍のPDFをアップロードすれば、なんでもその書籍に関する質問に答えてくれるカスタムGPTができてしまうのだ。

「Knowledge」の使い方はファイルをアップロードするだけとシンプルなので、この記事では「Instructions」と「Actions」を特に詳しく解説していく。

今回作成するカレンダーGPTの完成図

この記事では、ChatGPTに「今週の予定を教えて」とか、「月曜に1時間のチームMTGをセットして」といった指示をすることで、Googleカレンダーを読み出し・書き込みしてくれるスケジュール管理に特化したカスタムGPTを作成する。

Googleカレンダーは、GoogleによってAPIが提供されており、外部のアプリなどからGoogleカレンダーの予定を読み出したり書き換えたりといったことが可能になっている。

このGoogleカレンダーのAPIを活用して、GPTにGoogleカレンダーを操作するActionsを実装していく。

最終的にはGPTの設定画面は以下のようになる。
Google Calendar APIとの連携を設定し、スケジュール管理のために適切なインストラクションを与えている。

実際に完成したカスタムGPTである「Calendar GPT」に、「来週月曜の予定を教えて」と聞いてみたところ、サクッと予定をリストアップしてくれた。

この記事で紹介する手順を順に真似していけば、あなただけのスケジュールアシスタントを簡単に作成することができる。

それでは、以下でこの「Calendar GPT」の作り方を、ステップバイステップで詳しく紹介していく。

Google Calendar APIをGPTの「Actions」として使う方法

Googleカレンダーを、各種アプリと連携させて予定の参照・追加・削除などを行うには、Googleが提供するCalendar APIというRESTful APIを使用する必要がある。

今回のGPTにも、このCalendar APIの使用方法を伝授することによって、GPTがGoogleカレンダーと連携しつつ会話してくれるようになる。

GPTの作成画面で、「Configure」モードの下部にある「Actions」で「Create new action」をクリックすると、このような外部のAPIをGPTに組み込むことができる。

今回はGoogle Calendar APIの実装方法を紹介するが、実装の一連の流れは大抵のAPIで共通なので、他に使用したいAPIがある人は、この記事の流れを参考に実装してみるとよい。

Google CalendarのOpenAPI Specificationの作成

「Create new action」をクリックして、Actionsの編集画面に進むと、以下のような「Schema」を入力することを求められる。

ここでGoogle Calendar APIなど、GPTで使用したい外部APIの仕様を教えてあげることで、カレンダーにある予定を取得するGETメソッドや、カレンダーに新規の予定を追加するPOSTメソッドなどを、GPTが「Actions」として実行できるようになるのだ。

この時に必要となる指示書が、「OpenAPI Specification」というAPIの仕様書のフォーマットになる。

ちなみにChatGPTを開発している「OpenAI」と、API仕様のフォーマットである「OpenAPI」は、非常に名前が似ているが、無関係である。
OpenAI以外の企業やアプリも、普通にOpenAPIを利用していることがある。

Google Calendar APIでは、残念ながらOpenAPI Specificationは公式に用意されていないので、オリジナルで作成する必要がある。

APIそのものの仕様や、必要になる個々のメソッドの仕様が分かりさえすれば、OpenAPI Specificationを自作することは可能だ。

今回でいえば、カレンダーの予定の確認、追加、更新、削除を可能にしたいので、Google Calendar APIの公式ドキュメントに載っている多数のメソッドのうち、以下のメソッドが必要になると思われる。

  • Events: get – 指定されたイベントを返す
  • Events: insert – カレンダーイベントを作成する
  • Events: list – 指定された期間のイベントリストを返す
  • Events: delete – カレンダーイベントを削除する
  • Events: patch – イベントを更新する
  • Events: update – イベントを更新する

個々のメソッドのページを見ると、アプリ側からどのようにリクエストを行えば良いかが紹介されている。

ここの記述を、OpenAPI Specificationのフォーマットに落とし込んでいく。

とはいえ、自力でやるのは非常に面倒なので、この作業自体を、ChatGPTにお任せしてしまったほうが楽だ。

カレンダーAPIのドキュメントから、Eventsオブジェクトの解説ページと、実装したいメソッド(例えばgetメソッド, insertメソッド)の解説ページを、それぞれPDFとしてダウンロードして、ChatGPTにOpenAPI Specificationを作れ、と以下のようなプロンプトで指示してみると、ちゃんと作ってくれた。

これらはGoogle Calendar APIのドキュメントです。これらのドキュメントを参照し、get, insertメソッドをActionsとして実装したカスタムGPTを作成するためのOpenAPI Specificationを、JSON形式で執筆してください。

ただ、get, insert, list, delete, updateなどなど全てのメソッドの実装を頼むと、かなり長いJSONでの返信が必要になるので、ChatGPTの出力が途中で切れてしまったりと、全てのメソッドを一発のプロンプトだけで出力させることは中々うまくできなかった。

そこで、まずはget, insertなどシンプルなメソッドのみを実装したOpenAPI Specification(JSON形式)をChatGPTに作ってもらった後、さらに、GPT-4がコードの執筆をサポートしてくれるエディタであるCursorを使って、加筆修正を行なった。

以下がChatGPTが作ってくれたJSON形式のOpenAPI Specificationである。最低限の内容しか入っていない。

JSONファイルとしてローカルに保存し、Cursorのチャットを使って部分的に加筆を行っていく。

Cursorを使うと、OpenAPI Specificationの一部だけを指定して加筆を依頼するなど柔軟な指示ができるので、ChatGPTよりもスムーズに作業が進んだ。
「listメソッドをここに追加して」、といった感じで、ChatGPTが作った既存のJSONファイルに、足りないメソッドを追記していく。

こうした完成したJSONを、GPTの「Configure」-「Actions」-「Create new actions」のページにある「Schema」の項にコピペすると、問題なくOpenAPI Specificationが作成できていれば、「Available actions」としてメソッドの一覧が表示される。

意図した通り、イベントの取得、追加、更新、削除のために必要なメソッドが登録できていることがわかる。

筆者は、OpenAPI Specificationの知識はゼロで、今回初めて自作したが、ChatGPTやCursorでAIの力を借りることで自力で作成することができた。本当にすごい時代である。

読者の皆さんが同じ手間を繰り返さなくても良いように、この記事の一番下に、私が作成したGoogle Calendar APIのOpenAPI Specificationを公開しておく。

作業が面倒な人はそこから丸ごとコピーして、そのままActionsにペーストすれば同じように使えるはずだ。

ただし、本当に筆者はOpenAPI Specificationの専門知識があるわけではないので、記述が正しいかどうかなどは一切保証しない。ご利用は自己責任でお願いしたい。

なお、この記事では、OpenAPI Specificationの記述をシンプルにするため、そのユーザーのGoogleカレンダーに初期から存在するメインのカレンダー(primary)のみに対応している。

Googleカレンダーに複数のカレンダーを作成している場合、メインのカレンダーの予定以外は参照できないので注意してほしい。
メイン以外のカレンダーにも対応するには、Eventsオブジェクト以外にも、CalendarListCalendarsの記述も追加しなければならない。

Google Calendar APIの準備

Calendar APIをGPTが利用できるようにするためには、前項のようなOpenAPI Specificationの作成だけでなく、Google Cloud側での初期設定も必要になる。

よく見る画面だと思うが、カレンダーアプリやメールアプリなど、第三者が開発したアプリケーションと、自分のGoogleのアカウントを接続する際、そのアプリにどのような権限を付与するかを確認する以下のような画面が表示されるだろう。

今回作成するカスタムGPTsも、Google APIを経由してGoogleカレンダーにアクセスするので、ユーザー(今回は自分)が、アプリ(今回はGPTs)に、Googleカレンダーへのアクセス権限を付与することになる。

この権限付与を可能にするには、あらかじめ開発するアプリケーション(今回はGPTs)をGoogleクラウドに登録して、ユーザーのどのような情報へのアクセスを要求するかを、設定しておかねばならない。

まずは、今回のカスタムGPTをGoogle Cloudに登録する。

Google Cloudのトップページを開いたら、新しいプロジェクトを作成する。

プロジェクト名はどのようなものでも良いが、分かりやすく「Calendar GPT」とする。

Google Cloudの左側のメニューから「APIとサービス」を開く。

先ほど作成したプロジェクトがアクティブになっていることを確認した上で、「APIとサービスの有効化」をクリック。

「Google Calendar API」で検索をすると、すぐにカレンダーのAPIが見つかる。

クリックした上で、Google Calendar APIを「有効化」する。

すると、左側のメニューの「有効なAPIとサービス」に「Google Calendar API」が追加される。

今度は、このAPIを使用するために必要となる「認証情報を作成」をクリックする。

「認証情報の種類」のステップで、「Google Calendar API」を選択していることを確認し、「ユーザーデータ」を選択した上で「次へ」をクリックする。

「OAuth同意画面」(よく見る「このアプリにGoogleサービスへのアクセスを許可しますか?」的な同意画面)のステップで、ユーザーに表示するサービス名などを設定できる。

今回の場合、自分だけで使うGPTsの作成を想定しているので、ここで表示されているアプリ名やユーザーサポートの連絡先は、特に第三者に表示されることはない。

次に、アクセスに同意を求める「スコープ」を設定する。

今回は、カレンダーの予定のリストアップ、新規作成、削除を実行できるようにしたいので、「全てのカレンダーの予定の表示と編集」の権限を付与したい。

Google Calendar APIのcalendar.eventsがこれにあたるので、チェックをつけて保存する。

クライアントIDの設定では、今回は種類を「ウェブアプリケーション」と指定しておく。GPTsはウェブアプリという立ち位置であると思われるからだ。

名前は適当につけておけば良い。

以上で認証情報の設定が完了したら、「APIとサービス」のメニューをクリックし、「認証情報」を開くと、「クライアントID」「クライアントシークレット」がそれぞれ確認できるようになる。

これを、後ほどGPTsの作成時に、認証情報として入力する必要があるので、その際にこのページに戻って来れるように場所を覚えておこう。

「Actions」でのGoogle CalendarのOAuth認証の設定

ここからは、再びGPTの作成画面に戻る。

「Configure」モードから「Actions」に進み、先ほど作成したOpenAPI Specificationを入力した画面に戻る。

Google Cloud側で作成した認証情報をGPTの設定に反映することで、外部APIを呼び出すためのログイン方法を設定するようなイメージだ。

OpenAPI Specificationと利用できるメソッドの一覧の下に、「Authentication」という項があるので、これをクリックする。

認証方法を選ぶことができるが、Calendar APIの場合は「OAuth」を選択する。

すると、以下の情報を入力する画面が現れる。

認証に用いるクライアントID、クライアントシークレット、URL各種の入力を求められるが、以下のように入力する。

  • Client ID: Googleクラウド側で作ったものを入力
  • Client Secret: Googleクラウド側で作ったものを入力
  • Authorization URL: https://accounts.google.com/o/oauth2/v2/auth
  • Token URL: https://oauth2.googleapis.com/token
  • Scope: https://www.googleapis.com/auth/calendar.events

以上の設定を終えたら、一度GPTを保存する。

「Publish to」は今回作成したGPTの公開範囲を選択するものだが、自分だけで使うので「Only me」(=非公開)を選択するとよい。

ここから、もう一度Googleクラウド側に戻る必要がある。

一度GPTの設定画面で、認証情報を入力し保存すると、Callback URLというURLが初めて表示されるようになる。
このCallback URLが、Googleクラウド側で必要になるのだ。

先ほど保存したGPTで、もう一度GPTの設定画面を開き、Callback URLをコピーする。
「Configure」タブの「Actions」の直下にURLが表示されているはずである。

Callback URLをコピーしたら、Google Cloudのアプリケーションの認証情報のページに戻り、「承認済みのリダイレクトURI」に、Callback URLをペーストする。

自分のGoogleアカウントのテストユーザー化

いよいよ大詰めだが、Googleクラウド側で、最後にユーザーの設定が必要になる。

今回有効にしたカレンダーAPIを利用できるユーザーの範囲を、Googleクラウドの設定画面で設定できるものだ。

一般公開は想定していないので、テストユーザーとして自分のメールアドレスを指定する。

例えば、自分と友達1人のGoogleのアカウントをここで登録しておけば、その2人だけが今回作ったGPTからGoogle Calendar APIを呼び出すことができるようになる。

これを保存すれば、ようやくGPTでGoogleカレンダーAPIをActionsとして使用する準備が全て整った。

「カレンダーGPT」のインストラクションの作成

ここまでの作業で、今回作成するGPTが利用できるActionsが固まったので、あとはGPTに具体的にどのように動作して欲しいかを、「Configure」タブの「Instructions」に記入する。

この部分は、いわば今後の全ての会話のベースとなるプロンプトで、このGPTが何を目的に作られ、どのような機能を持ち、どんな口調で話すのかなどを指定するものだ。

筆者は英語で作成しているが、同じ内容を日本語で書くと、以下のようになる。
(英語で作ろうが、日本語で作ろうが、動作するので使いやすい方で作成するべし)

Calendar GPTは、主にGoogleカレンダーAPIを利用して、イベントの整理やスケジューリングを行うためのパーソナルアシスタントです。カレンダーからのイベントの追加、更新、削除に長けていますが、変更を行う前に常にユーザーの確認を求め、ユーザーのスケジュールコントロールを保証します。予定やリマインダーの管理に長けているCalendar GPTは、スケジュールの衝突を巧みに回避し、ユーザーの既存のコミットメント、好み、国際的な会議のためのタイムゾーンなどを考慮して、最適な会議時間を提案します。

プロフェッショナルな姿勢で、Calendar GPTは、明瞭、簡潔、正確なスケジュール情報を提供することを約束し、ユーザーのプライバシーとイベントの詳細に関する機密性を優先します。また、GoogleカレンダーAPIの機能案内や、よくある技術的な問題のトラブルシューティングも可能で、ユーザーの技術的な専門レベルに合わせたコミュニケーションを行います。

さらに、Calendar GPTは、日時を表示または一覧する際に、以下のような特定の形式を遵守します: "2023年12月1日(金)15:00〜16:00".

ユーザーの指示に基づいて、アシスタントとしてスケジュールを調整する、というメインの機能を指示しているほか、GoogleカレンダーAPIを利用してそれを実現すべきことにも触れてある。

カレンダーの予定を表示するときのフォーマットを、日本の曜日表示に合わせて欲しいので、‌2023年12月1日(金)15:00〜16:00といったフォーマットの指定もInstructions中で行っている。

他にも、自分ならではのスケジューリングのルールがあれば、Instructionsの項に書き込んでおけば、GPTに守らせることができて便利だ。

「Conversation starters」は、いわばワンクリックで呼び出せるショートカットという感じで、「今日の予定を教えて」といった定型文を登録しておくことができる。

登録した定型文は、以下の画像のように、ChatGPTを開いて今回作ったGPTを実際に呼び出して新規チャットを開始した際に、ワンクリックで使えるように初期表示される。

オリジナルの「カレンダーGPT」を使ってみる

以上でGPTの全ての設定が完了したので、いよいよGoogleカレンダーにChatGPTが自由自在にアクセスして、秘書アシスタントとして活躍してくれるカレンダーGPTを実際に使ってみる。

いつものChatGPTの画面を開くと、左上に作成したGPTが表示されているはずだ。
今回でいえば、「Calendar GPT」と名付けたGPTが表示されている。

Googleアカウントへのアクセス許可

初回使用時は、Googleアカウントへのサインインを求められる。

「Sing in with www.googleapis.com」をクリックして、Googleクラウドでテストユーザーとして指定した自分のGoogleアカウントでログインする。

よくある認証画面で、どのGoogleアカウントでログインするかを選ぶことができる。

通常と異なるのは、Calendar APIへのアクセスをテストユーザーとして認証する形になるので、以下のような警告メッセージが表示される点だ。

少しミスリーディングなボタンの配置だが、左側の「続行」をクリックすることで、GPTでCalendar APIを呼び出せるようになる。

「すべてのカレンダーの予定の表示と編集」という、Googleクラウドのスコープで設定した通りの許可を求められる。

一度認証に成功したら、セッションが続いている限り繰り返しログインする必要はない。

「予定を教えて」などと指示して、GPTがAPIリクエストを実行しようとすると、Google APIに情報を送信しても良いか尋ねられるので、Always allowを選択する。

これで全ての利用の準備が整った。

ChatGPTが秘書のように予定を管理してくれる!

「来週月曜の予定を教えて」と聞いてみると、月曜に予定されている全てのイベントが無事に表示された。

裏側でGPTが、自らGoogleカレンダーAPIのlistメソッドを使って、月曜の0時から23時59分までの予定のリストを入手してくれているのだ。

もちろん、カレンダーにイベントを追加することもスムーズに実行できる。

「明日の正午から1時間、ワークアウトの予定を入れて」と伝えると、Googleカレンダーにちゃんと「ワークアウト」という予定が追加された。

「Talked to googleapis.com」と表示されている箇所の詳細を表示してみると、GPTがどのようなリクエストボディーをGoogle Calendar APIに送信しているかをみることもできる。

イベントのタイトル(ワークアウト)、開始時間・終了時間、タイムゾーンなどが的確に入力されている。

これも、OpenAPI Specificationで仕様を伝えているからこそ成せる技というわけだ。

また、patch, update, deleteによる既存の予定の変更や削除も問題なく動作することが確認できた。

このカスタムGPTがあれば、誰でもChatGPT上で動作する秘書をゲットすることができる。
APIも全て自分で実装したので、ChatGPT Plusの月額以外には、追加料金もかかることなく、自分のGoogleカレンダーを管理してくれるパーソナルアシスタントが得られた。

メールでMTGの候補日時を送らなくてはいけない、といったシナリオで、「今週1時間のミーティングが可能な日時をリストアップして」と指示するだけで予定を書き出してもらうこともできる。

毎朝、今日の予定のブリーフィングをChatGPTから受けるといったことも可能になる。

自分が欲しい機能を盛り込んだGPTをオリジナルで作れるGPTsは、使いこなせば本当に便利な機能だ。

付録:GoogleカレンダーAPIのOpenAPI Specification

この記事で作成したGPTで使っているOpenAPI Specificationを以下にそのまま公開しておく。

ChatGPTとCursorを使って、AIのサポートのもとで作成されたものなので、ご利用は自己責任でお願いしたい。

これは、Calendar APIのうち、以下のメソッドを利用できるようにしたものだ。

GPTに自然言語で指示するだけで、Googleカレンダーのある期間の予定一覧を取得したり、特定の予定の詳細を取得したり、新規の予定を作成したり、既存の予定を削除したり、既存の予定を更新したりできるようにすることを意図している。

  • Events: get
  • Events: insert
  • Events: list
  • Events: delete
  • Events: patch
  • Events: update

重要な仮定として、Googleカレンダーのアカウント上に、複数のカレンダーがある場合(businessとprivateなどカレンダーを分けている場合)は、サブカレンダーは全て無視して動作することを前提にしている。

OpenAPI Specificationの記述をシンプルにするため、そのユーザーのGoogleカレンダーに初期から存在するメインのカレンダー(primary)のみに対応しているためだ。

公開日:2023年12月14日

{
    "openapi": "3.0.0",
    "info": {
      "title": "Google Calendar API",
      "version": "v3",
      "description": "API for interacting with Google Calendar, focusing on retrieving calendar events within a specified time range.",
      "contact": {
        "name": "Google",
        "url": "https://developers.google.com/calendar"
      }
    },
    "servers": [
      {
        "url": "https://www.googleapis.com/calendar/v3"
      }
    ],
    "paths": {
      "/calendars/primary/events": {
        "get": {
          "summary": "List all events in the primary Google Calendar",
          "operationId": "listEvents",
          "tags": [
            "Event Operations"
          ],
          "description": "This endpoint allows the AI agent to fetch a list of events from the user's primary Google Calendar, which can be used to review upcoming events or to synchronize with external systems.",
          "parameters": [
            {
              "name": "timeMin",
              "in": "query",
              "required": false,
              "description": "Lower bound (inclusive) for an event's start time to filter by.",
              "schema": {
                "type": "string",
                "format": "date-time"
              }
            },
            {
              "name": "timeMax",
              "in": "query",
              "required": false,
              "description": "Upper bound (exclusive) for an event's end time to filter by.",
              "schema": {
                "type": "string",
                "format": "date-time"
              }
            }
          ],
          "responses": {
            "200": {
              "description": "Provides a detailed list of events from the primary calendar, filtered by the specified time range if provided, including information such as event IDs, titles, descriptions, and timing details.",
              "content": {
                "application/json": {
                  "schema": {
                    "$ref": "#/components/schemas/EventList"
                  }
                }
              }
            }
          }
        },
        "post": {
          "summary": "Create a new event in the primary Google Calendar",
          "operationId": "createEvent",
          "tags": [
            "Event Operations"
          ],
          "description": "This endpoint allows for creating a new event in the user's primary Google Calendar.",
          "requestBody": {
            "description": "The event details that need to be created.",
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Event"
                }
              }
            }
          },
          "responses": {
            "201": {
              "description": "The event has been successfully created. The response includes the details of the newly created event, such as the event ID, title, and timing details.",
              "content": {
                "application/json": {
                  "schema": {
                    "$ref": "#/components/schemas/Event"
                  }
                }
              }
            },
            "400": {
              "description": "The request could not be understood by the server due to malformed syntax. The client SHOULD NOT repeat the request without modifications."
            }
          }
        }
      },
      "/calendars/primary/events/{eventId}": {
        "get": {
          "summary": "Retrieve details of a specific event from the primary Google Calendar",
          "operationId": "getEvent",
          "tags": [
            "Event Operations"
          ],
          "description": "This endpoint allows the AI agent to fetch detailed information about a specific event by its ID from the user's primary Google Calendar. This can be used to display event details or to update them.",
          "parameters": [
            {
              "name": "eventId",
              "in": "path",
              "required": true,
              "schema": {
                "type": "string"
              }
            }
          ],
          "responses": {
            "200": {
              "description": "Provides the details of the requested event, including event ID, title, description, and timing details.",
              "content": {
                "application/json": {
                  "schema": {
                    "$ref": "#/components/schemas/Event"
                  }
                }
              }
            }
          }
        },
        "patch": {
          "summary": "Partially update an event's details",
          "operationId": "patchEvent",
          "tags": [
            "Event Operations"
          ],
          "description": "This endpoint allows for partial updates to an event's details in the user's primary Google Calendar. It can be used to modify specific fields of an event without altering the entire event structure.",
          "parameters": [
            {
              "name": "eventId",
              "in": "path",
              "required": true,
              "schema": {
                "type": "string"
              },
              "description": "The unique identifier for the event to be updated."
            }
          ],
          "requestBody": {
            "description": "Partial event details that need to be updated. Only the fields provided in the request body will be updated.",
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Event"
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The event has been successfully updated with the provided details. The response includes the updated event data.",
              "content": {
                "application/json": {
                  "schema": {
                    "$ref": "#/components/schemas/Event"
                  }
                }
              }
            }
          }
        },
        "put": {
          "summary": "Update an event's details",
          "operationId": "updateEvent",
          "tags": [
            "Event Operations"
          ],
          "description": "This endpoint allows for a complete update of an event's details in the user's primary Google Calendar. All fields of the event must be provided in the request body.",
          "parameters": [
            {
              "name": "eventId",
              "in": "path",
              "required": true,
              "schema": {
                "type": "string"
              },
              "description": "The unique identifier for the event to be updated."
            }
          ],
          "requestBody": {
            "description": "Complete event details that need to be updated. The entire event structure must be provided.",
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Event"
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The event has been successfully updated with the new details. The response includes the updated event data.",
              "content": {
                "application/json": {
                  "schema": {
                    "$ref": "#/components/schemas/Event"
                  }
                }
              }
            },
            "400": {
              "description": "Invalid request. The event ID provided did not match any existing events, or the event data provided was incomplete or formatted incorrectly."
            },
            "404": {
              "description": "The event to update was not found."
            }
          }
        },
        "delete": {
          "summary": "Delete an event from the primary Google Calendar",
          "operationId": "deleteEvent",
          "tags": [
            "Event Operations"
          ],
          "description": "This endpoint allows the AI agent to remove an event from the user's primary Google Calendar by specifying the event's unique identifier. This is useful for canceling events or cleaning up past events that are no longer needed.",
          "parameters": [
            {
              "name": "eventId",
              "in": "path",
              "required": true,
              "schema": {
                "type": "string"
              },
              "description": "The unique identifier of the event to be deleted."
            }
          ],
          "responses": {
            "204": {
              "description": "The event has been successfully deleted. No content is returned."
            },
            "404": {
              "description": "The event to delete was not found. No action was taken."
            }
          }
        }
      }
    },
    "components": {
      "schemas": {
        "Event": {
          "type": "object",
          "description": "A schema defining the structure of an event in the Google Calendar. It includes all the necessary details such as identifiers, timing, and participant information.",
          "properties": {
            "id": {
              "type": "string",
              "description": "A unique identifier for the event. This is used to reference the event in API calls."
            },
            "summary": {
              "type": "string",
              "description": "A brief summary or title of the event."
            },
            "description": {
              "type": "string",
              "description": "A detailed description of the event. This can include the agenda, topics to be discussed, or any other relevant information."
            },
            "start": {
              "type": "object",
              "description": "The start time of the event, including the date, time, and timezone.",
              "properties": {
                "dateTime": {
                  "type": "string",
                  "format": "date-time",
                  "description": "The date and time when the event starts, in ISO 8601 format."
                },
                "timeZone": {
                  "type": "string",
                  "description": "The timezone in which the start time is specified."
                }
              }
            },
            "end": {
              "type": "object",
              "description": "The end time of the event, including the date, time, and timezone.",
              "properties": {
                "dateTime": {
                  "type": "string",
                  "format": "date-time",
                  "description": "The date and time when the event ends, in ISO 8601 format."
                },
                "timeZone": {
                  "type": "string",
                  "description": "The timezone in which the end time is specified."
                }
              }
            },
            "location": {
              "type": "string",
              "description": "The location where the event is taking place. This can be a physical address or a virtual meeting link."
            },
            "attendees": {
              "type": "array",
              "description": "A list of attendees participating in the event, along with their response status.",
              "items": {
                "type": "object",
                "properties": {
                  "email": {
                    "type": "string",
                    "description": "The email address of the attendee."
                  },
                  "responseStatus": {
                    "type": "string",
                    "description": "The attendee's response status for the event invitation (e.g., 'accepted', 'declined')."
                  }
                }
              }
            },
            "organizer": {
              "type": "object",
              "description": "The organizer of the event, typically the person who created the event.",
              "properties": {
                "email": {
                  "type": "string",
                  "description": "The email address of the organizer."
                },
                "displayName": {
                  "type": "string",
                  "description": "The display name of the organizer."
                }
              }
            }
          }
        },
        "EventList": {
          "type": "object",
          "description": "A schema representing a list of events, as would be retrieved from a 'list' operation on the Google Calendar API.",
          "properties": {
            "items": {
              "type": "array",
              "description": "An array of event objects, each representing an individual event in the Google Calendar.",
              "items": {
                "$ref": "#/components/schemas/Event"
              }
            }
          }
        }
      }
    }
  }



Comments

  • Comments ( 2 )
  • Trackbacks ( 0 )
  1. お世話になります。
    大変参考になりました。
    ぜひ、「複数のカレンダーがある場合(businessとprivateなどカレンダーを分けている場合)は、サブカレンダーは全て無視して動作することを前提」の部分を、他のカレンダーの予定も見られるものになるとよいなぁ、などと思いました。

    が、どうせ使い分けが難しく、AIを頼るので、一つにまとめた方が身のためだとも思いました(笑)
    活用させていただきますm(_ _)m

    • 重ねて失礼します。
      もし、バージョンアップが可能でしたら「予定」の入力だけでなく、「タスク」の入力が可能か教えていただけませんでしょうか。
      OpenAPI Specificationをいじればできそうな気がするのですが、何分初心者で・・・よろしくお願いしますm(__)m

Make a comment

*
*
* (公開されません)