はじめに
みなさん、Claude Code の カスタムスラッシュコマンド(custom slash commands)と Skills をどう使い分けていますか?
今年のはじめに「カスタムスラッシュコマンドは Skills に統合されました」というアナウンスがあったので、もうカスタムスラッシュコマンドを使っていない人も多いとは思いますが、フォルダが分かれていて管理しやすい側面もあったので、私は下記のような感じで使い続けてました。
- 明示的にしか呼び出したくないもの
- → カスタムスラッシュコマンド
.claude/commands/
- → カスタムスラッシュコマンド
- 明示呼び出し or 自動で読み込まれてもいい
- → Skills
.claude/skills/
- → Skills
でもそれにより、少し想像していなかったことが起きました。
何が起きたのか
統合されたことで、フロントマターの description に書かれた内容に一致すれば、カスタムスラッシュコマンドも自動的に呼ばれる ようになっていたのです。
つまり、これまで「明示的にしか呼ばれないだろう」と思って .claude/commands/ 配下に置いていたコマンドも、ユーザーの入力次第で勝手に発火する可能性があるということになります。
実際に試してみる
たとえば、リリースノートの草案を自動出力するためのカスタムスラッシュコマンドを置いていたとします。
---
description: 直近のコミットから次回リリースノートの草案を生成する
---
git log と前回タグから差分を取り、リリースノートの草案を生成して
テキストファイルで出力してください。
この状態で Claude Code に「次のリリースノート書きたいんだけど」と相談したとします。本人としては、書き方の相談をしたかっただけで、/release-note-idea と明示的に打ったわけではありません。
それでも description が入力にマッチしてしまうので、Claude はこのコマンドを自動的に呼び出して、テキストファイルが生成されてしまいます。
description を省略した場合でも、本文の1行目が入力にマッチすれば同じように自動で呼ばれてしまいます。
# 直近のコミットから次回リリースノートの草案を生成する
git log と前回タグから差分を取り、リリースノートの草案を生成して
テキストファイルで出力してください。
「いやいや、.claude/commands/ 配下は明示呼び出し用でしょ」と思い込んでいた身としては、これは割と罠だなと感じました。上記例ではテキストファイルが生成されるだけなのでまだ被害は小さいですが、MCP を使ってどこかに投稿するみたいな内容が含まれていたら、ちょっと問題だなと。
そもそも Skills に統合されたってことはそういうことでしょ?説明もっと読んでおけばわかるでしょって感じかもしれませんが。。
解決策: disable-model-invocation: true を付ける
フロントマターに以下を1行追加するだけです。
---
description: 〜
disable-model-invocation: true
---
これで、Claude が description(や本文)を見て勝手に呼び出すことはなくなります。もちろん Skills 側にも同じオプションが用意されています。
このオプション自体は知っていましたが、カスタムスラッシュコマンドを Skills 統合前の挙動に戻すために必要になるとは思っていませんでした。
逆に言うと、disable-model-invocation: true がついていないカスタムスラッシュコマンドの description は、常にコンテキストに読み込まれている、ということでもあります。コンテキスト節約の観点でも、明示呼び出ししかしないものには付けておくのが無難そうです。
まとめ
| 使い方 | 置き場所 |
|---|---|
| 明示的にしか呼び出したくない | カスタムスラッシュコマンド(.claude/commands/) |
| 明示呼び出し or 自動で読み込まれてもいい | Skills(.claude/skills/) |
上のような使い分けをしている人は、とりあえずカスタムスラッシュコマンドの方に disable-model-invocation: true を追加しておくのが、事故が起きにくく、コンテキストの節約にもなると思います。
私自身は、一旦は事故が起きないよう上の対応をしていましたが、今は、管理上わかりやすいように、Skills 名にプレフィックス(例: cmd- など)をつけるなどして Skills に移行しています。(とはいえそんな数はないですが)
もしまだカスタムスラッシュコマンドを使っているよって方の参考になれば幸いです。