Claude Codeを使用して外出先で予定管理ツールを作った話

Wed Apr 15 2026

はじめに

外出先でイベントのチラシや告知画像を見かけたとき、「あとでカレンダーに入れよう」と思って結局忘れることが多かった。その場でDiscordに画像を送るだけで自動的にGoogleカレンダーへ登録してくれるBotがあれば便利だと思い、ClaudeCodeに作らせてみた。

コードはほぼすべてClaudeCodeが書いた。自分はやりたいことを日本語で伝えて、エラーが出たらログを貼る、という役割に徹した。


作ったもの

deadline_reader — 画像を送るとカレンダーに登録してくれるDiscord Bot

Discord(画像添付)
  └─► Bot (discord.js)
        └─► Gemini Vision API(画像からイベント情報を抽出)
              └─► Google Calendar API(カレンダーに登録)
                    └─► Discord(埋め込みで結果を返信)

抽出される情報はタイトル・日付・開始/終了時刻・場所・詳細。時刻が取れない場合は終日イベントとして登録される。


Claude Codeへの指示の流れ

「GeminiAPIのキーを設定したので、実行してログを見てデバッグしてほしい」と伝えた。

Claude Codeはまずリポジトリ全体を読んで構造を把握し、.envファイルの変数名を確認した。するとANTHROPIC_API_KEYが存在せずGEMINI_API_KEYだけが設定されているのを発見。コードはまだAnthropicのSDKを使っていたため、extractor.jsをGemini API対応に書き換えてくれた。

ここから先はエラーが出るたびにログを貼って修正を指示する、というサイクルの繰り返しだった。

AIがはまってしまっていたポイント

① 修正が反映されない

書き換えたあとに「まだgemini-2.0-flashを叩いている」とエラーが出た。

原因はClaude Codeがワークツリー(.claude/worktrees/以下)のファイルを修正していたのに、実際に動くBotはメインプロジェクトのファイルを読んでいたこと。「別のファイルを修正していた」と気づいて、メインプロジェクト側も修正してくれた。

② 使えるモデルが分からない

gemini-2.0-flash429 limit: 0が出た。これは「クォータ超過」ではなく「そのモデルは無料枠では使えない」という意味だった。

「Gemini APIで実際に使えるモデルをListModelsで確認して」と指示すると、Claude CodeがREST APIでモデル一覧を取得してくれた。試した結果がこちら:

モデル 結果
gemini-2.0-flash 429(free tier limit: 0)
gemini-1.5-flash 404(廃止済み)
gemini-2.0-flash-lite 429(free tier limit: 0)
gemini-2.5-flash OK

③ 503エラーがリトライされない

gemini-2.5-flashは需要が高く、503が返ることがある。「503エラーが出ています。リトライ処理が503も拾えているか確認して」と伝えると、既存のcallWithRetry()が429しか見ていないことをClaude Codeが指摘し、503対応を追加してくれた。

最終的なリトライ仕様:

  • 429:レスポンスのretryDelayを使って待機(なければ60秒)
  • 503:10秒→20秒→30秒の線形増加(上限30秒)
  • 最大リトライ回数:5回

人間側が工夫をしたところ

API部にのみ、AIにデバッグ→改善のループを回させる

コードが書きあがる→Discordで実際に動作させる→エラーがでる→エラーを貼り付ける

というプロセスが面倒だった

エラーの内容は、実際にAPIの処理を実行させればわかるものなのにもかかわらず、Discordのユーザーの入力がないとなんの処理も走らないというこのプロジェクトの性質上、AIにAPI部のテストをさせることができなかった。

そこで、ローカルの画像ファイルを直接Geminiに投げてデバッグできるテストスクリプトの作成をClaude Codeに指示した。できあがったtest_image.jsを使えば、Discordを介さずにコマンドラインから抽出処理だけを試せる。

node test_image.js IMG_4337.png

実際のインターンシップ募集のチラシ画像を食わせた結果:

{
  "title": "書類提出締切",
  "date": "2026-05-12",
  "startTime": "10:00",
  "endTime": null,
  "location": null,
  "description": "第1次締切: 2026年5月12日 (火) 午前10時、第2次締切: 2026年6月08日 (月) 午前10時"
}

日付・時刻・タイトルが正しく取れていた。

毎回プロセスをkillするようにした

毎回プロセスを立ち上げっぱなしのまま新しいプロセスを立ち上げやがるので、

「修正後にプロセスをkillして」

という指示を追加した


感想

コードを一行も書かずに動くものができた。自分がやったのは「こういうものが欲しい」「このエラーが出た」を伝えることだけ。(厳密には何点か詰まっている点を解消させる指示を飛ばしたが)

Claude Codeが特に役立ったのはデバッグ局面で、「ログを見てデバッグして」という雑な指示でも、プロセスの確認→ファイルの特定→修正→再起動まで一気にやってくれた。

ただし「どのファイルを実際に読んでいるか」は自分でも把握しておかないと、修正したつもりで反映されていない、という状況に気づきにくい。Claude Codeを使役するうえでのコツとして覚えておきたい。