
Claude CodeのModsは、Hooksと何が違うのか
Claude Code に Mods という機能が追加されました。
Claude 派の私としては、ぜひとも理解して活用したいところです。
Mods公式チュートリアル
ただ、公式の説明を見ても、Mods と Hooks の違いがよく分からない。
Hooks公式仕様
ということで、AIに相談しながら内容を整理してみました。
個人的には、『なるほどな?』と思ったので、参考になれば幸いです。
従来の Hooks は、処理が走るきっかけ
非エンジニアの方向けにも説明しておくと、Hooks というのはプログラムの中で別のプログラムを呼び出すきっかけのことです。
フック、という名前が示すように、プログラム上の様々なところに、別のプログラムをひっかけられるフックが用意されているんですね。
ここにプログラムをひっかけておくことで、特定のタイミングで、自分の好みのプログラムを呼び出させることができます。
例えば、Claude Code には、PreToolUse という Hook があります。
これは各種ツール(ファイルを読んだりスクリプトを実行するなど)が実行される前に呼び出されるフックです。
ここに、危険なコマンドを検出して実行を拒否するプログラムをひっかけておけば、Claude Code が危険な処理を行うことを防ぐことができます。
このように、フックというのは、特定のタイミングで自分好みのプログラムを実行するために使えます。
Mods もきっかけは同じ、でもパラメータが違う
Mods も、Hooks のように、決められたタイミングで実行される点は同じです。
先ほどの PreToolUse と同じように、危険な処理を止めるプログラムを自前で用意することは、Mods でも可能です。
(Mods の場合は、tool.call というイベントになります)
では、Mods は何が違うのか。
一言で言ってしまうと、Mods の処理プログラムに渡される引数(パラメータ)が違います。
Hooks は、PreToolUse なら、今実行しようとした処理の内容が渡されます。
なので、その中身を判定して、処理を止めることができます。
Mods では、Claude Code 自身のオブジェクトが渡されます。
もっと細かく言うと、Claude Code を制御できる API の束が渡されます。
これは、Mods のプログラムの中では「$」という特別な変数として渡されます。
この「$」にアクセスすることで、Claude Code の様々な部分を制御できます。
例えば、皆さんが普段入力しているチャット欄の上に、今どれぐらいのコンテキスト(チャットが記憶してる情報量)が溜まっているのかを棒グラフのように表示することもできます。
これは Hooks ではできません。
なぜなら、Hooks には、画面を操作できる「$」が渡されていないからです。
Mods は、この「$」が渡されていることで、様々な処理ができるようになっています。
Mods と Hooks はライフサイクルも違う
Mods と Hooks では、そのプログラムのライフサイクル、つまり、「生きている時間」も違います。
Hooks では、基本的に、フックとなる処理が実行されたときに、フックにひっかけておいたプログラムが起動され、一連の処理が終了すると、起動されたプログラムは終了します。
そのため、複数のフックで情報をやりとりするには外部ファイルなどを経由する必要があります。
一方、Mods はセッション(一連のチャット)単位で起動されます。
つまり、新しいチャットを作成したときに、Mods のプログラムは起動され、チャットが終了するときまで維持されます。
この仕組みにより、複数のタイミングで行われた処理も、同じプログラムで引き継いで利用できます。
このような特徴から、Mods では状態管理が非常にやりやすくなっています。
例えば、PreToolUse(tool.call)が呼ばれた回数のカウントなどは、わざわざ外部ファイルを用意しなくても、プログラムの中で完結できます。
これを活用すれば、「危険な処理が呼ばれた回数」なども、簡単に画面に表示することができます。
ユーザーにとっては、「Claude が危険なことをしようとしている」と判断できる材料にもなります。
注意点としては、Mods であっても、モジュールの再読み込みをするとリセットされてしまう点が挙げられます。
これに対応するには、先ほどの「$」がもつ「$.state」という入れ物にデータ(例えば、危険な処理が呼ばれた回数)を保存しておく必要があります。
終わりに
これらのことを元に考えると、私の中で『Mods と Hooks の違いは何か?』という問いに対して、次のような答えが出てきました。
「$」が渡されるか否か。
つまり、Claude Code の各種制御が行える変数が渡されるかどうかが、Mods と Hooks の一番の違いではないかと思います。
この「$」が渡されることで、Mods では単なる Hooks には実現できない処理が可能となる。
そのように理解しました。
異論は受け付けます。
もし間違いなどがあれば、ご指摘いただけると幸いです。