確認コードで誤登録を防ぐ—freee MCP安全設計


読み取り連携の次に考えたのが、AIから会計取引を登録する場合の安全設計です。結論は、生成と登録を同じツールで行わないことでした。

prepareとcreateを分ける

処理を二段階に分けます。

  1. prepare_deal:入力を検証し、実際に送るpayloadと確認コードを返す。freeeは変更しない
  2. create_deal:同じpayloadと一致する確認コードがあり、書き込みが有効な時だけ登録する

確認コードは、正規化したpayloadのハッシュから作ります。金額、日付、勘定科目、税区分、摘要の一文字でも変われば一致しません。人がプレビューを確認した後に内容が差し替わる事故を防げます。

三つのブレーキを重ねる

一つの設定だけに頼らず、次の条件をすべて満たした時だけ書き込みます。

  • 環境変数で書き込みが明示的に有効
  • 入力が日付、金額上限、必須項目の検証を通る
  • prepareで発行した確認コードがcreate時の内容と一致

この方式なら、エージェントが誤ってcreateを選んでも、通常運用では書き込み無効で止まります。書き込みを有効にする時間も限定し、検証後にfalseへ戻します。

テストした失敗ケース

実装では、成功例より拒否例を重視しました。

  • 書き込み無効のままcreateすると拒否される
  • 間違った確認コードは拒否される
  • 上限を超える金額はprepare時点で拒否される
  • 不正な日付や取引種別は拒否される
  • トークン保存と読み戻しができる
  • 初期設定が必ず読み取り専用になる

会計連携では「正しく登録できる」だけでなく、「間違った条件では登録できない」ことが品質です。

監査ログへ本文を残しすぎない

監査ログには、時刻、操作種別、対象、成功・失敗、payloadのハッシュなどを記録します。摘要や相手先などの機密情報を全文で複製しない設計にします。調査に必要な情報と、漏えい時の影響を比較して項目を決めます。

再現チェック

  • [ ] prepareは外部サービスを変更しない
  • [ ] createは書き込みフラグと確認コードを要求する
  • [ ] コードはpayload全体から作る
  • [ ] 金額と日付の上限・形式を検証する
  • [ ] 拒否ケースを自動テストした
  • [ ] 監査ログへ機密本文を複製しない

次回は、このfreee連携をHermes Agentから使えるようにするstdio MCPサーバーの役割を整理します。

参考にした一次情報


Back to top