この記事を読んでまず思ったのは、AIエージェントに便利なツールを与える話なのに、熱量の中心が「何をできるようにするか」ではなく「どう壊れにくくするか」にあるのがいい、ということだった。こういう話はついデモ映えする自動化に寄りがちだけれど、ここでは Bean Validation で入力を縛り、stateless なサービスとして置き、Goose から MCP 経由で呼ばせる。派手さはないけれど、現場で使うならそっちが先だよな、と思った。
特に引っかかったのは、AI agent に enterprise API や database migration を直接やらせるのは「brittle and dangerous」とはっきり書いているところだ。これはかなり実感がある。エージェントが賢くなっても、つなぐ先が雑なら事故る。だから「便利なラッパーを作る」より、「呼べる操作の形を狭くする」ほうが大事になる。@Pattern や @NotNull で customer ID を縛る例は地味だけれど、こういう地味さが本当に効く場面は多いと思う。
一方で、この記事は Part 1 らしく、まだかなり設計寄りだとも感じた。Quarkus、LangChain4j、MCP、Goose、Java 25 と並ぶと、技術スタックの相性のよさは見えるのだけれど、実運用でどこまで認可や監査、失敗時の扱いを詰めるのかはこの先を読まないと分からない。とくに「governed」という言葉を使うなら、本当はツールの引数チェックだけでは足りないはずで、誰がいつ何を呼んだか、どの権限で呼んだかまで見たくなる。そこまで踏み込むのかは気になった。
それでも、AIエージェントを“自由に動く魔法の存在”としてではなく、“制約のある業務ツールの一種”として扱っている姿勢は好ましい。ここを雑にすると、結局は面白いけれど怖いデモで終わる。この記事は、その入口をちゃんと押さえようとしているように見えた。
参考: Part 1: Building Governed MCP Tool Services With Quarkus LangChain4j and Goose