予定とメールを扱うAIを作って、権限と入力形式でつまずいた話
Googleのサービスをつなぐ個人用ツールを作りました。OAuthの再同意と、配列のitemsが抜けたツール定義。会話の外側で起きた失敗の記録です。
予定を確認して、メールを探して、必要ならタスクにする。普段いくつもの画面でやっていることを、会話から扱えるようにしたくて、個人用のAIアシスタントを作っています。
2026年7月には、GoogleのCalendar、Tasks、Drive、Gmail、Contacts、Docs、Sheetsを扱うツールを組み込みました。n8nとDiscordを使う構成です。つまずいたのは、AIの返答をどう書かせるかより、その先のAPIにつなぐ部分でした。
権限をコードに足しても、同意は更新されなかった
最初に困ったのがOAuthです。アプリに許す操作の範囲を表す「スコープ」を設定に追加しても、以前の同意で取得した認証情報には、その権限が増えていませんでした。
コードには使いたい権限が書いてある。なのにAPIからは拒否される。設定ファイルだけを見ていると、ここを見落とします。
必要だったのは、新しい範囲について同意を取り直すことでした。この経験から、接続を調べるときは「実装が要求する権限」と「実際に許可された権限」を分けて見るようになりました。ログインできたことと、目的の操作ができることも別です。
一つの配列定義で、ツール全体のリクエストが落ちた
もう一つは、Geminiに渡すツールの入力定義です。配列であることを示すARRAYは書いていたのに、その中身の型を表すitemsが抜けていました。
その状態では、該当するツールを実行する前に、ツール定義を含むリクエスト自体が400で失敗しました。複数のツールをまとめて渡していたため、会話全体が止まって見えます。
自然言語での指示を直しても、この入力形式の不備は直りません。モデルに渡す定義を確認して、配列の要素まで型を書き足しました。AIの機能が増えるほど、会話だけを試すのでは原因を追いづらくなります。
会話を通す前に、接続を単独で試す
Google APIを直接fetchしていた部分はgoogleapisへ移し、接続を確認するためのスクリプトも追加しました。認証とAPI呼び出しを単独で試せれば、問題が会話側にあるのか、接続側にあるのかを切り分けられます。
メールを読む操作と送る操作では、間違えたときの影響も違います。便利にするほど、どこまでAIに任せるかを明確にしたいです。送信のように相手へ影響する操作では、内容を確認する人の判断を残すつもりです。
なお、これは7月の実装を振り返った記事です。9月には開発環境をWindowsからMacへ移しており、移行後の再接続と起動確認は別の作業として残っています。ツールを書けたことと、普段の環境で使い続けられることの距離は、まだ埋めているところです。
関連:趣味紹介のAIで作る