Claude Codeのカスタムコマンドの作り方
毎回同じ指示を書いたり、必要な情報を会話から探したりする作業は、短いコマンドで呼び出せるようにすると扱いやすくなります。
私は、依頼の一覧を見る/daichouと、設計書を見る/mapを作りました。この記事では、この2つを実例に、コマンドにする作業の選び方と、登録・実行までの作り方を紹介します。
カスタムコマンドとは
Claude Codeで / に続けて名前を打つと、決めておいた処理や指示を呼び出せます。/help のような組み込みのものに加えて、自分で用意したものも同じ形で呼べます。これがカスタムコマンドです。
作り方は2通りあります。
| 作り方 | 何が起きるか | 向いている用途 |
|---|---|---|
| 指示を書いたファイルを置く(公式の機能) | 書いた内容がAIへの指示として渡り、AIが実行する | 定型の指示、手順、確認作業 |
| プラグインのフックで処理を登録する(自作の拡張) | 自分のスクリプトが動き、結果がそのまま画面に出る。AIは呼ばない | 一覧や設計書のように、中身をそのまま見たいだけの表示 |
以下では、前者の作り方から順に説明します。
何をコマンドにすると便利か
向いているのは、次のような作業です。
- 毎回ほとんど同じ文章で頼んでいる(例:変更を確認して、コミット文を提案する)
- 決まった情報を集めてから頼んでいる(例:直近のコミット履歴を見せてから要約を頼む)
- 決まった場所のファイルを、いつも同じ形で見たい(例:依頼の一覧、設計書)
逆に、毎回内容が大きく変わる作業は、コマンドにしても入力が減りません。
作り方(公式の方法)
一つ作って呼び出すところまで、最小の例で示します。直近のコミットを要約させるコマンドです。
- プロジェクトの中に、
.claude/skills/recent-commits/SKILL.mdというファイルを作る(フォルダ名がコマンド名になる) - 次の内容を書く
---
description: 直近5件のコミットを、初めて見る人向けに3行で要約する
disable-model-invocation: true
---
次のコミット履歴を、初めて見る人向けに3行で要約してください。
!`git log --oneline -5`
- Claude Codeで
/recent-commitsと打つ
先頭の --- で挟んだ部分が設定で、description は一覧に出る説明です。disable-model-invocation: true は、AIが勝手に呼ばず、自分が打ったときだけ動くようにする指定です。! とバッククォートで囲んだ部分は、AIに渡す前にPC側で実行され、その結果が文章に差し込まれます。
.claude/commands/名前.md という1ファイルの形(古い形式)も引き続き使えますが、公式資料は新しく作るならスキルを勧めています。自分用に全プロジェクトで使いたいときは、~/.claude/skills/ に置きます。引数を渡したいときは、本文に $ARGUMENTS と書くと、コマンドの後ろに打った文字が入ります。
この形でできるのは「AIへの指示を短い名前で呼ぶ」ことです。実行すると、結果は読み込まれた指示に沿ってAIが返します。
作った実例:/daichou と /map
私は、AIに任せた仕事の依頼を台帳で管理しています。/daichou は台帳の中身を、/map は設計書を、打つとすぐに画面に出します。
| コマンド | 出てくるもの |
|---|---|
/daichou | 頼んだこと・私への質問を、緊急・回答待ち・作業中・待機の4区分で一覧にしたもの |
/map | 設計書。目的・目標・当面の流れ・今日の目標 |
使うのはAIの返事ではなく、ファイルの中身そのものです。上の方法で作ると、毎回AIが中身を読み直して文章にするため、時間もトークンも使います。そこで、この2つは別の作り方にしました。
AIを呼ばない作り方(自作の拡張)
Claude Codeのプラグインには、フックでコマンドを登録し、処理の結果をそのまま画面に返せる仕組みがあります。私の環境のものは、次の3つのファイルでできています。
.claude-plugin/plugin.json… 名前と説明hooks/hooks.json… 読み込むフックのファイルを指定hooks/register.ts… コマンドの登録と、打たれたときの処理
register.ts の要点は次のとおりです(パスは仮のものに替えています)。
export const register: Register = on => {
on('session.start', async ($, e, next) => {
await $.command.register({
name: 'daichou',
description: '台帳をその場で出す。AI は呼ばない',
immediate: true,
})
return next(e)
})
on('command.run', { command: 'daichou' }, async $ => {
const r = await $.process.run(['python', '-X', 'utf8', '台帳を出すスクリプト.py'])
return { text: r.stdout.trim() }
})
}
起動時にコマンド名と説明を登録し、immediate: true でその場で実行する指定にします。打たれたら、普通のスクリプトを動かし、出力をそのまま画面に返します。台帳も設計書もファイルを読んで文字にするだけなので、AIは要りません。
注意点が3つあります。
- 公式の「カスタムコマンド」とは別の仕組み。 私が使っているのは、Claude Codeの初期公開(early access)のプラグイン機能で、仕様は予告なく変わることがあります。この記事の範囲では公式資料で確認できていないため、使うなら手元のバージョンで確かめてください
- 私の環境では、設定の環境変数
CLAUDE_CODE_PLUGIN_DIRSにプラグインのフォルダを指定して読み込んでいます - コマンド名は英数字だけにしました。同じ名前でスマホのTelegramからも使うためです
/daichou の使い方
画面で /daichou と打つだけです。質問に答えるときも、一覧の番号をそのまま使えます。
1A:1番の質問に案Aで答える1A 3B:まとめて答える5 済:5番を済みにする
台帳は、頼みごとが会話に埋もれないように、1件ずつ記録して終わるまで残す仕組みです。待機の行には待っている理由が付き、24時間以上手つかずの件には警告が出ます。
使ってみて
頼んだことを覚えておく役目が、人間からコマンドに移りました。「あれはどうなった?」と探したり、AIに説明し直したりする時間が減っています。実測した時短の数字はまだ取っていません。
確かめたこと、確かめていないこと
- 確かめたこと:
/daichouと/mapは、自分の環境で日常的に動いています - 確かめていないこと:この記事の最小の例(
/recent-commits)は、書き方を公式資料に合わせたもので、記事のために動かして確認はしていません。自分の環境で一度動かして確かめてください
まとめ
- カスタムコマンドは、繰り返す作業を短い名前で呼ぶもの。作るなら、
.claude/skills/名前/SKILL.mdに指示を書くのが基本 - 結果をAIに任せたい作業は公式の方法、中身をそのまま表示したいだけなら自作のプラグインという使い分けができる
- 台帳の仕組みとコマンドを全部自分で組むのは手間がかかるが、残りが見える状態になる価値は大きい
作るのに時間をかけたくないときは
詰まりどころを1つずつ潰していく時間は、どうしてもかかります。実際に作って動かしているものは、そのまま使える形に整えています。 新しく出したときと、記事にしていない小さな回避策は公式LINEで先に流しています。今あるものはAIクラフトに置いてあります。
よくある質問
カスタムコマンドを使うと、AIは呼ばれないのですか?
公式の方法(スキルファイルやcommandsフォルダ)で作ったコマンドは、書いた内容がAIへの指示として渡るため、AIが動きます。AIを呼ばずに結果だけ表示したい場合は、この記事の後半で紹介する、プラグインとして作る自作の方法が必要です。
作ったコマンドが一覧に出ません。
スキルとして作った場合は、ファイルの変更を実行中でも拾います。ただし、スキル用のフォルダ自体をその日初めて作ったときは、`/reload-skills` を実行するか、Claude Codeを起動し直します。
関連記事
PCとiPhoneで画像・ファイルを共有する方法
PCとiPhoneのどちらからも画像・ファイル・メモを共有できる自作ツールを紹介。画像をAIの作業へ渡し、ブログの素材、画像加工、エラー画面の確認に使う流れをまとめます。
iPhoneの共有ボタンから1タップでPCへ送る方法
iPhoneのショートカットアプリで、共有ボタンにPCへの送り先を追加する方法。Xのポストや撮ったスクショを、写真に保存せずにそのまま自宅PCのフォルダへ送れます。
iPhoneから自宅PCのターミナルを使う方法
TermiusとTailscaleを使い、iPhoneから自宅PCのターミナルへ接続する構成を紹介。外出先でClaude Code・Codexを使い、作業を続ける方法と、接続時の注意点をまとめます。