CLAUDE.mdとSkillsの違いは、CLAUDE.mdが「毎回のセッションの最初に必ず読み込まれる前提の情報」であるのに対し、Skillsは「必要になったときだけ本文が読み込まれる、手順や専門知識のパッケージ」であることです。毎回知っておいてほしい事実はCLAUDE.mdに、特定の作業のときだけ必要な手順や長い参考資料はSkillsに置くと、Claude Codeは少ない文脈(コンテキスト)で、より正確に動けるようになります。

Claude Codeには、このほかにも.claude/rules/、Hooks(フック)、サブエージェント、設定のpermissionsといった仕組みがあり、「どこに何を書くか」で迷いやすくなっています。この記事では、公式ドキュメント(2026年9月時点)を確認したうえで、Claude Code v2.1.283 で実際にSkillを作って動かし、読み込まれるトークン数や自動で呼び出されるかどうかを確かめた結果を載せながら、使い分けの判断表、置き場所の具体例10件、CLAUDE.mdからSkillsへの移し替え手順までを解説します。CLAUDE.md自体の書き方は姉妹記事「CLAUDE.mdの書き方」で扱っているため、ここでは使い分けと移し替えに絞ります。

CLAUDE.md・Skills・関連機能の早見表

仕組み 置き場所(プロジェクト) いつ文脈に入るか 誰が使うか 強制力 向いている内容
CLAUDE.md ./CLAUDE.md または ./.claude/CLAUDE.md 毎セッションの開始時に全文 常に適用 指示(お願い) ビルド・テストのコマンド、構成、全体の規約
.claude/rules/ .claude/rules/*.md pathsなし:開始時に全文/pathsあり:該当ファイルを読んだとき 常に適用 指示(お願い) 特定のファイル・ディレクトリだけの規約
Skills .claude/skills/<name>/SKILL.md 開始時は説明文(description)だけ。本文は呼び出されたとき 自分(/name)またはClaudeが判断 指示(お願い) 手順、チェックリスト、長い参考資料
Hooks .claude/settings.json の hooks 決まったタイミングでコマンドを実行 Claude Codeが自動で 確実に実行・ブロックできる フォーマッター実行、保護したいファイルの編集ブロック
サブエージェント .claude/agents/<name>.md 呼び出されたとき、別の文脈で動く Claudeが委任/自分で指定 ツール制限を設定できる 大量のログや調査結果を扱う、独立した作業
permissions .claude/settings.json の permissions ツールを使う前に判定 Claude Codeが自動で 確実に許可・禁止できる 実行してよいコマンド、読ませないファイル

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「CLAUDE.mdとSkillsの違い|使い分け判断表と移し替え手順」

決定的な違いは「いつ読み込まれるか」:実測で確認

公式ドキュメントでは、Skillsについて「CLAUDE.mdの内容と違い、スキルの本文は使われるときだけ読み込まれるので、長い参考資料も必要になるまでほとんどコストがかからない」と説明しています。これを実際に確かめました。

同じ150行の規約(画面の入力チェックのルール)を、3つの置き方で用意し、/context コマンドで起動直後の文脈の使用量を比べました。

# A: Skillとして置く
.claude/skills/screen-rules/SKILL.md   # frontmatter + 150行の規約

# B: .claude/rules/ に paths なしで置く
.claude/rules/screen-rules.md          # 150行の規約のみ

# C: .claude/rules/ に paths つきで置く
.claude/rules/screen-rules.md          # paths: ["src/screens/**/*.ts"] + 150行の規約

claude -p "/context" の出力から、該当する行を抜き出した結果です(Claude Code v2.1.283、パスは省略)。

## A: skill
| Memory files | 20 | 0.0% |
| Skills | 4.3k | 0.9% |
| screen-rules | Project | < 20 |

## B: rules without paths
| Memory files | 8.9k | 1.8% |
| Skills | 4.3k | 0.9% |
| Project | .../.claude/rules/screen-rules.md | 8.9k |

## C: rules with paths
| Memory files | 20 | 0.0% |
| Skills | 4.3k | 0.9% |

(Memory files の20トークンは、別に置いた2行のCLAUDE.md、Skills の4.3kは組み込みスキルなどを含む一覧全体の量です。)

Skillとして置いた場合、起動時に文脈に入ったのは説明文の20トークン未満だけでした。同じ内容をpathsなしのルールに置くと、毎セッション8.9kトークンが使われます。pathsつきのルールは、起動時には読み込まれず、該当するファイルを読んだときに読み込まれます。

置き方 起動時のトークン 本文が入るタイミング
Skill 20未満(説明文のみ) /screen-rules と入力したとき、またはClaudeが必要と判断したとき
rules(pathsなし)/CLAUDE.md 8.9k(全文) 毎セッションの開始時
rules(pathsあり) 0 src/screens/**/*.ts に合うファイルを読んだとき

「毎回は要らないが、使うときは詳しく書いておきたいもの」はSkillsに置くと、文脈を大きく節約できます。文脈が軽いほど、CLAUDE.mdに書いた大切な指示も守られやすくなります。

Skills(SKILL.md)の基本

置き場所

種類 パス 使える範囲
個人 ~/.claude/skills/<skill-name>/SKILL.md このマシンの自分の全プロジェクト
プロジェクト .claude/skills/<skill-name>/SKILL.md このリポジトリ(コミットすればチームで共有)
ネスト <subdir>/.claude/skills/<skill-name>/SKILL.md そのディレクトリ以下で作業するとき
プラグイン <plugin>/skills/<skill-name>/SKILL.md プラグインを有効にした場所(/plugin-name:skill-name)
組織(Enterprise) 管理設定ディレクトリ内の .claude/skills/ 組織が配布したマシンの全ユーザー

同じ名前のスキルがある場合は、組織 → 個人 → プロジェクトの順で優先されます。まずはプロジェクトの.claude/skills/に置き、Gitにコミットしてチームで共有する形から始めるのがわかりやすいでしょう。

SKILL.mdの書き方

SKILL.mdは、先頭のfrontmatter(---で囲んだYAML)と、その下のMarkdownの本文でできています。---はファイルの1行目に置きます。

---
name: release-note
description: リリースノートの下書きを作る。リリースノート、変更履歴、CHANGELOGの作成を頼まれたときに使う。
disable-model-invocation: true
argument-hint: "[version]"
---

バージョン $ARGUMENTS のリリースノートを作ります。

1. 前回のタグからのコミットを確認する
2. 「新機能」「改善」「修正」に分類する
3. 利用者に関係のない内部の変更は省く

よく使うfrontmatterの項目です。

項目 意味 ポイント
name スキルの名前。/name で呼び出せる 省略するとディレクトリ名になる
description 何をするか、いつ使うか Claudeが自動で使うかどうかの判断材料。when_to_use と合わせて1,536文字で切り詰められるので、大事な使い道を先に書く
when_to_use 使う場面の補足 description の後ろに追加される
disable-model-invocation true でClaudeによる自動呼び出しを止める デプロイやコミットなど、自分のタイミングで実行したい作業に
user-invocable false で / メニューから隠す 自分では呼ばない背景知識に
argument-hint 引数の入力ヒント 例:[issue-number]
allowed-tools スキル実行中に確認なしで使えるツール 例:Bash(git add *) Bash(git commit *)
paths 自動で使う対象をファイルのパターンで絞る 例:"src/**/*.ts"
context / agent context: fork でサブエージェントとして別の文脈で実行 agent で種類(Explore など)を指定

本文では、$ARGUMENTS(渡された引数すべて)、$0・$1(n番目の引数)が使えます。また、行頭などに !`コマンド` と書くと、スキルが読み込まれる前にコマンドが実行され、その出力が本文に差し込まれます。

---
name: diff-summary
description: 未コミットの変更を要約する。
disable-model-invocation: true
---

## 変更されたファイル
!`git status --short`

上のファイル一覧だけを、そのまま箇条書きで出力してください。ツールは使わないでください。

新しいファイルを1つ置いた状態で claude -p "/diff-summary" を実行した結果です。git status --short の出力が差し込まれていることがわかります。

- ?? .claude/skills/diff-summary/
- ?? newfile.txt

SKILL.mdは500行以内が目安です。詳しい参考資料は、同じディレクトリに reference.md などとして分け、本文からリンクしておくと、必要なときだけ読まれます。

.claude/skills/api-guide/
├── SKILL.md         (必須。概要と手順)
├── reference.md     (詳しい仕様。必要なときに読まれる)
└── scripts/
    └── check.py     (実行するスクリプト。中身は文脈に入らない)

読み込まれるタイミング

段階 文脈に入るもの
セッション開始時 各スキルの name と description(disable-model-invocation: true のスキルは入らない)
呼び出されたとき SKILL.md の本文(引数や ! の出力を反映したもの)が1つのメッセージとして入る
その後のターン 本文は会話の中に残り続ける(ファイルは読み直されない)
自動要約(コンパクション)のあと 各スキルの直近の呼び出しが先頭5,000トークンまで再添付される(全スキル合計25,000トークンまで)

スキルの本文は「1回読まれたら、その会話の中にずっと残る」ため、作業の途中で守ってほしいことは、1回きりの手順ではなく、作業全体に通じる指示として書くのがコツです。

誰が呼び出すかを決める

frontmatter 自分で呼べる Claudeが呼べる 文脈への読み込み
(指定なし) はい はい 説明文は常に、本文は呼び出し時
disable-model-invocation: true はい いいえ 説明文も入らない。本文は自分が呼んだとき
user-invocable: false いいえ はい 説明文は常に、本文は呼び出し時

実際に確かめました。指定なしのスキル api-errors(APIのエラー形式の規約)を置いて「このプロジェクトのAPIのエラーレスポンスはどんな形式にすればいい?」と聞くと、Claudeが自分でスキルを呼び出しました。

TOOL_USE Skill {"skill": "api-errors"}
RESULT `{"error": {"code": "E-XXXX", "message": "..."}}` の形式にする。(api-errors skill)

一方、disable-model-invocation: true のスキル release-note を置いて「バージョン2.0.0のリリースノートを作って」と頼んだ場合は、スキルは呼び出されず、一般的な回答が返りました。/release-note 1.4.0 と明示的に入力すると、スキルの本文どおりに動きました。

$ claude -p "/release-note 1.4.0"
RELEASE-NOTE-SKILL-LOADED v1.4.0

(確認用に、本文を「決まった文字列を出力する」だけの内容にして試しています。)

スラッシュコマンドとの関係

カスタムのスラッシュコマンドは、Skillsに統合されました。.claude/commands/deploy.md と .claude/skills/deploy/SKILL.md は、どちらも /deploy を作り、同じように動きます。既存の .claude/commands/ のファイルもそのまま使えます。実際に .claude/commands/hello.md を置いて claude -p "/hello RJC" を実行すると、コマンドファイルの内容どおり COMMAND-FILE-LOADED RJC が返りました。

観点 .claude/commands/<name>.md .claude/skills/<name>/SKILL.md
/name で呼び出す できる できる
補足ファイル(参考資料・スクリプト) 置けない 同じディレクトリに置ける
Claudeによる自動呼び出し — description をもとに判断される
これから作るなら 既存分はそのままでよい こちらが推奨

/help や /compact のような組み込みコマンドは、スキルとは別のものです。

使い分けの判断表

迷ったら、上から順に質問に答えていくと、置き場所が決まります。

順 質問 「はい」なら
1 必ず禁止したい、または確認なしで許可したいツール操作か? permissions(allow・ask・deny)
2 Claudeの判断に関係なく、決まったタイミングで必ず実行したい処理か? Hooks
3 大量の出力を伴い、結果の要約だけがほしい独立した作業か? サブエージェント
4 手順・チェックリスト・長い参考資料で、特定の作業のときだけ必要か? Skills
5 特定のファイルやディレクトリを扱うときだけ必要な規約か? .claude/rules/(pathsつき)
6 どの作業でも毎回知っておいてほしい、短い事実や規約か? CLAUDE.md

それぞれの性質を、もう少し詳しく比べます。

観点 CLAUDE.md .claude/rules/ Skills Hooks サブエージェント permissions
中身 事実・全体の規約 範囲を絞った規約 手順・知識 シェルコマンド等 役割とプロンプト 許可・禁止のルール
文脈の消費 常に全文 全文または該当時 説明文のみ→呼び出し時に本文 ほぼなし(出力を渡す場合を除く) 別の文脈 なし
守られ方 Claudeの判断 Claudeの判断 Claudeの判断 確実に実行 設定したツール制限は確実 確実に適用
呼び出し 自動 自動 /name または自動 イベント発生時 委任・@指定 ツール使用時
置き場所 ./CLAUDE.md .claude/rules/ .claude/skills/ settings.json .claude/agents/ settings.json

CLAUDE.md・rules・Skillsは「Claudeへのお願い」、Hooksとpermissionsは「仕組みで保証するもの」と覚えておくと、判断がぶれにくくなります。公式ドキュメントも、CLAUDE.mdは強制される設定ではなく文脈として扱われるため、Claudeの判断に関係なく操作を止めたい場合はPreToolUseフックを使うよう案内しています。

Hooksは「確実に止める」ための仕組み

公式ガイドの例にならい、.env などの編集をブロックするフックを設定して試しました。

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/protect-files.sh" }
        ]
      }
    ]
  }
}
#!/bin/bash
# .claude/hooks/protect-files.sh(公式ガイドの例をもとにしたもの)
INPUT=$(cat)
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')
PROTECTED_PATTERNS=(".env" "package-lock.json" ".git/")
for pattern in "${PROTECTED_PATTERNS[@]}"; do
  if [[ "$FILE_PATH" == *"$pattern"* ]]; then
    echo "Blocked: $FILE_PATH matches protected pattern '$pattern'" >&2
    exit 2
  fi
done
exit 0

編集を許可するモード(--permission-mode acceptEdits)で「.env の末尾に1行追加して」と頼んだ結果です(パスと一部の項目は省略)。

TOOL_USE Edit {"file_path": ".../.env", ...}
TOOL_RESULT PreToolUse:Edit hook error: ["$CLAUDE_PROJECT_DIR"/.claude/hooks/protect-files.sh]: Blocked: .../.env matches protected pattern '.env'
RESULT .envはprotect-files.shフックにより保護されており、Editツールでの編集をブロックされたため追加できませんでした。

終了コード2でツールの実行が止まり、理由がClaudeに伝わって、Claudeが状況を説明しました。.env の中身は変わっていませんでした。

permissionsは「使ってよい操作」を決める仕組み

{
  "permissions": {
    "allow": ["Bash(npm run *)", "Bash(git commit *)"],
    "deny": ["Bash(git push *)", "Read(./.env)"]
  }
}

ルールは deny → ask → allow の順に評価され、最初に一致したものが適用されます。ユーザー設定で許可していても、プロジェクト設定で禁止していれば禁止が優先されます。

サブエージェントとSkillsの違い

観点 Skills サブエージェント
動く文脈 今の会話の中(会話の流れを踏まえられる) 別の文脈(会話の履歴は見えない)
向いている作業 会話と一緒に進める手順、再利用するプロンプト 大量の検索・ログ・テスト結果を扱い、要約だけ返す作業
ツールの制限 allowed-tools で事前承認を追加 tools で使えるツールを限定できる
組み合わせ context: fork でスキルをサブエージェントとして実行 frontmatterの skills でスキルを事前に読み込ませる

同じ内容をどこに置くか:具体例10件

# 置きたい内容 置き場所 理由
1 テストは npm test、ビルドは npm run build CLAUDE.md 毎回必要な短い事実
2 ディレクトリ構成(src/api はAPI、src/web は画面) CLAUDE.md どの作業でも前提になる
3 src/api/ 配下のエラーレスポンスの形式 .claude/rules/(paths: src/api/**) APIを触るときだけ必要
4 リリースノートを作る手順(分類・書き方) Skills(disable-model-invocation: true) 手順で、自分のタイミングで実行したい
5 画面の入力チェック規約150行 Skills または pathsつきrules 長く、使う場面が限られる
6 コードレビューの観点と出力形式 Skills 繰り返し使うチェックリスト
7 ファイルを編集したら必ずフォーマッターを実行 Hooks(PostToolUse、Edit|Write) 毎回確実に実行したい
8 .env や .git/ を編集させない Hooks(PreToolUse)と permissions(Read(./.env) の deny) お願いではなく仕組みで止めたい
9 git push は必ず人が確認してから permissions(ask または deny) 操作の許可をルールで決めたい
10 リポジトリ全体を調べて、影響範囲を一覧にする サブエージェント(読み取り専用ツールに限定) 大量の検索結果を本来の会話に持ち込まない

同じ「ルール」でも、「毎回か、特定の場面か」「お願いか、保証か」で置き場所が変わることがわかります。

CLAUDE.mdからSkillsへの移し替え手順

CLAUDE.mdが長くなってきたら、手順や長い資料をSkillsに移します。公式ドキュメントも、複数ステップの手順や、コードの一部にしか関係しない内容は、スキルやパス限定のルールに移すよう案内しています。

手順

ステップ やること 確認方法
1. 棚卸し CLAUDE.mdの各セクションに「事実」「手順」「特定の場所だけ」「必ず守らせたい」の印をつける 判断表の質問に当てはめる
2. 移し先を決める 手順→Skills、特定の場所だけ→rules、必ず守らせたい→Hooks・permissions 具体例10件を参考にする
3. SKILL.mdを作る .claude/skills/<name>/SKILL.md を作り、name と description を書き、本文を移す description に「何をするか+どんな依頼のときに使うか」
4. 呼び出し方を決める 副作用のある作業は disable-model-invocation: true / メニューに表示されるか確認
5. CLAUDE.mdから削除する 移した本文を消す。必要なら「リリース手順は /release-note を使う」と1行だけ残す 同じ内容が2か所に残っていないか
6. 動作を確かめる /context で文脈の量を、実際の依頼でスキルが使われるかを確認する Skillsの一覧に表示されるか

移し替え前と後

移し替え前のCLAUDE.md(手順が混ざっている):

# コマンド
- テスト: npm test

# リリースの手順
1. 前回のタグからのコミットを一覧にする
2. 「新機能」「改善」「修正」に分類する
3. 利用者に関係のない内部の変更は省く
4. CHANGELOG.md の先頭に追記する
5. バージョン番号を package.json に反映する

移し替え後のCLAUDE.md(事実だけ):

# コマンド
- テスト: npm test

# 作業の入口
- リリースノートの作成は /release-note を使う

移し替え後の .claude/skills/release-note/SKILL.md:

---
name: release-note
description: リリースノートを作り、CHANGELOG.mdとバージョン番号を更新する。リリースの準備、変更履歴の作成を頼まれたときに使う。
disable-model-invocation: true
argument-hint: "[version]"
---

バージョン $ARGUMENTS のリリースを準備します。

1. 前回のタグからのコミットを一覧にする
2. 「新機能」「改善」「修正」に分類する
3. 利用者に関係のない内部の変更は省く
4. CHANGELOG.md の先頭に追記する
5. バージョン番号を package.json に反映する

CLAUDE.mdは短く保たれ、手順は必要なときだけ読み込まれる形になりました。

よくある失敗と直し方

よくある状況 起きること 直し方
description が「便利なスキル」のように抽象的 Claudeがいつ使うか判断できず、自動で呼ばれない 「何をするか」+「どんな依頼のときに使うか」を具体的に書く
デプロイ用スキルを自動呼び出しのままにしている 意図しないタイミングで手順が始まることがある disable-model-invocation: true にする
「絶対に〜しない」をCLAUDE.mdやSkillsだけに書いている 文脈として扱われるため、確実ではない Hooks や permissions で仕組みにする
CLAUDE.mdとSKILL.mdに同じ手順を書いている 片方だけ更新されて内容が食い違う 本文は1か所(Skills)にまとめ、CLAUDE.mdは入口の1行だけにする
SKILL.mdに長い資料をすべて書いている 呼び出すたびに大量の文脈を使う 500行以内にし、詳細は reference.md などに分ける
ファイル名を skill.md や .claude/skills/SKILL.md にしている スキルとして認識されない .claude/skills/<name>/SKILL.md の形にする
! の後のコマンドが失敗する スキルの呼び出し自体が中断される コマンドを単体で実行して確認する。必要なら allowed-tools で許可する
小さな作業までサブエージェントに任せる 会話の流れが伝わらず、やり取りが増える 会話と一緒に進める作業はSkillsや通常の会話で行う

よくある質問

Q. Skillsと.claude/commands/は、どちらを使えばよいですか? A. これから作るならSkills(.claude/skills/<name>/SKILL.md)がおすすめです。どちらも /name で呼び出せますが、Skillsは補足ファイルを置けて、description による自動呼び出しや、呼び出す人の制御もできます。既存のコマンドファイルはそのまま使えます。

Q. スキルを作ったのに、Claudeが自動で使ってくれません。 A. description に使う場面が書かれているか、disable-model-invocation: true になっていないか、paths で対象が絞られていないかを確認してください。確実に使いたいときは /name で直接呼び出します。

Q. .claude/rules/のpathsつきルールとSkillsは、どう使い分けますか? A. 「特定のファイルを扱うときに、常に守ってほしい規約」はpathsつきルール、「特定の作業のときに使う手順や資料」はSkillsが向いています。ルールはファイルを読んだときに自動で入り、Skillsは作業の内容に応じて呼び出されます。

Q. チームで共有するには、どこに置けばよいですか? A. ./CLAUDE.md、.claude/rules/、.claude/skills/、.claude/agents/、.claude/settings.json をGitにコミットします。個人の好みは ~/.claude/ 配下や CLAUDE.local.md、.claude/settings.local.json に分けると、チームのファイルと混ざりません。

まとめ

  • CLAUDE.mdは毎回全文が読み込まれる「前提」、Skillsは必要なときだけ本文が読み込まれる「手順と知識」です
  • 実測では、150行の規約がSkillsなら起動時20トークン未満、paths なしのルールなら8.9kトークンでした
  • SKILL.mdは.claude/skills/<name>/SKILL.mdに置き、nameとdescriptionを書くのが基本です
  • 副作用のある作業はdisable-model-invocation: trueで、自分のタイミングだけで実行します
  • カスタムのスラッシュコマンドはSkillsに統合されており、/nameで同じように呼び出せます
  • 「必ず守らせたい」ことはHooksとpermissionsで、大量の出力を伴う作業はサブエージェントで扱います
  • CLAUDE.mdが長くなったら、棚卸し→移し先の決定→SKILL.md作成→削除→確認の順で移し替えます

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「CLAUDE.mdとSkillsの違い|使い分け判断表と移し替え手順」

株式会社RJCでは、AIに渡す前提と手順を整理し、チームで再利用できる形にする工夫を、プロジェクトの中で仲間と学び合っています。こうした知識を共有しながら、日々技術を磨いています。

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?