Claude Codeとfreee APIで、24時間働く「AI税理士」をSlackに召喚
はじめに
「税理士への相談、返信待ちで仕事が止まることはありませんか?」
「毎月の会計チェック、似たようなミスを目視で探すのに疲れていませんか?」
今回は、生成AI(Claude)と会計ソフト(freee)を連携させ、Slack上で24時間365日稼働する専属のAI税理士を自作した事例を紹介します。単なるチャットボットではなく、自ら会計データをパトロールし、異常があれば通知してくれる「エージェント」型のアプリです。
🤖 作ったもの:Slack完結型 AI税理士エージェント
ユーザーができることは非常にシンプルです。Slackの #accounting チャンネルで話しかけるだけ。
24時間 即時相談: 「この領収書、交際費でいいんだっけ?」に即答。
自動パトロール: 毎週月曜朝9時にfreeeのデータを全件チェック。異常値(例:不明な高額出金、源泉税のズレ)を自動検知して報告。
タスク管理: 「源泉税払っておいて」と頼むと、タスクリストに追加・完了管理まで実行。
🛠️ 技術スタックとアーキテクチャ
「実務で使える」をテーマに、サーバーレスで低コストかつ堅牢な構成にしました。
カテゴリ技術役割インフラGCP Cloud Functions (Python 3.11)サーバーレス実行環境DBFirestoreタスク・会話履歴・レート制限管理スケジューラCloud Scheduler定期パトロールのトリガーAIClaude API (Claude 3.5 Sonnet)推論、Tool Useによる操作外部連携Slack Events API / freee APIUIおよび会計データ連携
処理フロー:
Slackでメンション or ボタン操作
Cloud Functionsが起動
Claudeが意図を理解し、必要に応じてfreee APIからデータを取得(Tool Use)
Firestoreで状態を管理しつつ、Slackに回答
💡 実務に耐えるアプリにするための「10の技術的工夫」
AIアプリを「デモ」で終わらせず「実運用」に乗せるために実装した、泥臭いけれど重要なポイントを公開します。
1. Slackの「3秒ルール」とリトライ地獄への対処
Slack Events APIは3秒以内にレスポンスがないとリトライを送信してきます。LLMの生成を待っていると重複実行されてしまうため、X-Slack-Retry-Num ヘッダーを見てリトライリクエストは即座に無視(200 OK)する処理を入れています。
2. freee OAuthトークンの自動更新(メンテナンスフリー化)
freeeのアクセストークンは6時間で切れます。手動更新は非現実的なので、実際にAPIを叩いて有効性を確認し、無効ならリフレッシュトークンを使って自動更新・Secret Managerへの保存を行う自律的な認証機構を実装しました。
3. 「年末調整」を考慮したプロンプトエンジニアリング
単に数字のズレを見るだけでは、12月〜1月の年末調整還付金などで「異常」と誤検知してしまいます。
プロンプトに**「会社情報の『給与計算の注意事項』を考慮せよ」**というルールを組み込み、年末調整時期の特異な動きは risk: none と判定させるドメイン知識を実装しました。
4. Tool Useの「あいまい検索」対応
ユーザーは正確なタスク名を覚えていません。「源泉税完了にして」と言われた際、「源泉所得税納付」というタスクを部分一致で検索し、複数候補がある場合はユーザーに選択肢を提示する親切設計にしています。
5. フェイルオープンなレートリミット
APIコストと負荷対策のため、Firestoreを使って「60秒間に10回まで」という制限を設けています。ただし、Firestoreのエラー等で判定できない場合は「禁止」ではなく「許可」する(フェイルオープン)ことで、ユーザー体験を損なわないように配慮しました。
👨💻 ソースコードの構成
保守性を高めるため、1ファイル300行ルールを設け、責務ごとにモジュール分割しています。
slack_events.py: Slackとの対話処理
freee_client.py: 会計データの取得
claude_client.py: AIとの通信・Tool Use
prompts.py: 税務知識や判定ルールの記述
まとめ
このアプリの導入により、経営者は「今すぐ知りたい」疑問を深夜でも解消でき、経理担当者はルーチンワークである「異常値チェック」から解放されました。
APIをつなぐだけでなく、**「業務の文脈(コンテキスト)」**をコードとプロンプトに落とし込むことで、AIは頼れるパートナーになります。
