読み取り連携の次に考えたのが、AIから会計取引を登録する場合の安全設計です。結論は、生成と登録を同じツールで行わないことでした。
prepareとcreateを分ける
処理を二段階に分けます。
prepare_deal:入力を検証し、実際に送るpayloadと確認コードを返す。freeeは変更しないcreate_deal:同じpayloadと一致する確認コードがあり、書き込みが有効な時だけ登録する
確認コードは、正規化したpayloadのハッシュから作ります。金額、日付、勘定科目、税区分、摘要の一文字でも変われば一致しません。人がプレビューを確認した後に内容が差し替わる事故を防げます。
三つのブレーキを重ねる
一つの設定だけに頼らず、次の条件をすべて満たした時だけ書き込みます。
- 環境変数で書き込みが明示的に有効
- 入力が日付、金額上限、必須項目の検証を通る
- prepareで発行した確認コードがcreate時の内容と一致
この方式なら、エージェントが誤ってcreateを選んでも、通常運用では書き込み無効で止まります。書き込みを有効にする時間も限定し、検証後にfalseへ戻します。
テストした失敗ケース
実装では、成功例より拒否例を重視しました。
- 書き込み無効のままcreateすると拒否される
- 間違った確認コードは拒否される
- 上限を超える金額はprepare時点で拒否される
- 不正な日付や取引種別は拒否される
- トークン保存と読み戻しができる
- 初期設定が必ず読み取り専用になる
会計連携では「正しく登録できる」だけでなく、「間違った条件では登録できない」ことが品質です。
監査ログへ本文を残しすぎない
監査ログには、時刻、操作種別、対象、成功・失敗、payloadのハッシュなどを記録します。摘要や相手先などの機密情報を全文で複製しない設計にします。調査に必要な情報と、漏えい時の影響を比較して項目を決めます。
再現チェック
- [ ] prepareは外部サービスを変更しない
- [ ] createは書き込みフラグと確認コードを要求する
- [ ] コードはpayload全体から作る
- [ ] 金額と日付の上限・形式を検証する
- [ ] 拒否ケースを自動テストした
- [ ] 監査ログへ機密本文を複製しない
次回は、このfreee連携をHermes Agentから使えるようにするstdio MCPサーバーの役割を整理します。
