Claude Code Skillsの作り方と使い分け — 最小単位・運用ROI・他レイヤ比較
Claude Code SkillsをSKILL.mdで作成・運用するときの最小単位・メリット/デメリット・他レイヤ(CLAUDE.md/Subagents/MCP)との使い分け・失敗パターンを整理します。
この記事で扱うこと
Claude Code Skillsは、.claude/skills/<name>/SKILL.md を1つ置くだけでClaudeに「専門知識パック」を追加できる仕組みです。/skill-name で手動呼び出しもでき、Claudeが文脈に応じて自動的に読み込むこともできます。手順書・チェックリスト・判断基準・参照資料を「毎回ペーストする」運用から、「ファイル化して呼び出す」運用へ切り替えるための最小単位です。
本記事は「Skillsをどう作るか / なぜ作るか / 他レイヤとどう使い分けるか / 失敗をどう避けるか」を網羅した作成ナレッジです。具体的な書き方(手順書型 / チェックリスト型 / 判断基準型 等の5パターン)はClaude Code Skillsの書き方 — 使える5つのパターン集で、設計思想の背景はAgent Skillsとは何かで扱っています。
Skillsを自作するメリット
SkillsはCLAUDE.mdやシステムプロンプトに直書きする運用との比較で5つの優位性を持ちます。
| メリット | 説明 |
|---|---|
| 遅延ロード(context効率) | CLAUDE.mdは常時contextに乗るが、Skillの本文は呼ばれたときだけ読み込まれる。長い参照資料を抱えても普段はトークン消費0 |
| 再利用性 | プロジェクト・個人・プラグインの3スコープで配置でき、同じSkillをチームで共有可能 |
| コマンド化 | ディレクトリ名がそのまま /skill-name で呼べるスラッシュコマンドになる。/commit /deploy /review-pr を運用に組み込める |
| 動的コンテキスト注入 | !`git diff HEAD` のようにSkill本文内でシェルコマンドを実行し、出力をClaudeに渡せる。「現在の差分」「現在の npm test 結果」を毎回確実にClaudeに届けられる |
| 権限の事前承認 | allowed-tools で「このSkillが動いている間はgitコマンドを承認なしに使える」と宣言できる。/commit を実行するたびに承認プロンプトが出る運用を解消できる |
「何度も同じ内容をChatGPT風にペーストしている」「CLAUDE.mdが手順の塊で膨れ上がってきた」がSkills化の最大シグナルです。公式も Create a skill when you keep pasting the same instructions, checklist, or multi-step procedure into chat, or when a section of CLAUDE.md has grown into a procedure rather than a fact. と明示しています。
Skillsを自作するデメリット・コスト
メリットの裏返しに、運用負荷もあります。
- メンテナンスコスト:本文の指示が古くなると、自動呼び出しのたびに古い手順を強化してしまう。リポジトリのコマンドやAPI変更に追随する必要がある
- 「呼ばれない問題」:
descriptionが抽象的だとClaudeが文脈一致を判断できず、自動呼び出しされない - 「呼ばれすぎ問題」:逆にdescriptionが広すぎると意図せず発動して、別の作業を邪魔する
- 本文のコンテキスト居座り:一度ロードされたSkillの本文はそのセッション中ずっとcontextに居座る(Claude Codeは再ロードしない)。長尺のSkillをinvokeするとそのまま継続的なトークンコスト(recurring)になる
- 権限の責任:
allowed-toolsで承認をスキップできるぶん、.claude/skills/を信頼するかどうかが信頼判断に直結する(プロジェクトSkillsはワークスペース信頼ダイアログを承諾した後に効く) - 記述の重複:同じ知識をCLAUDE.mdとSkill両方に書くと矛盾が生まれる。「どちらに書くか」の判断軸を最初に立てる必要がある
作成の最小単位
Skillはディレクトリ単位で管理し、必須は SKILL.md 1ファイルだけ。
.claude/skills/summarize-changes/
└── SKILL.mdSKILL.md の中身:
---
description: Summarizes uncommitted changes and flags anything risky. Use when the user asks what changed, wants a commit message, or asks to review their diff.
---
## Current changes
!`git diff HEAD`
## Instructions
Summarize the changes above in two or three bullet points...ディレクトリ名(summarize-changes)がそのまま /summarize-changes というスラッシュコマンドになります。description はClaudeが「いつ自動呼び出しするか」を判断する根拠なので、トリガフレーズ込みで具体的に書きます。
スコープと優先順位
| 配置場所 | 適用範囲 | 優先度 |
|---|---|---|
| Enterprise(Managed) | 組織全体 | 1(最強) |
| Personal | ~/.claude/skills/<name>/SKILL.md、全プロジェクト | 2 |
| Project | .claude/skills/<name>/SKILL.md、このプロジェクト限定 | 3 |
| Plugin | <plugin>/skills/<name>/SKILL.md | プラグイン有効箇所 |
同名のSkillがスコープを跨ぐと、Enterprise > Personal > Projectの順で上書きされます。Plugin Skillは plugin-name:skill-name の名前空間で衝突を回避します。
フロントマター仕様(全フィールド)
| フィールド | 用途 | 値の例 |
|---|---|---|
name | 表示名(省略時はディレクトリ名)。小文字・数字・ハイフンのみ、最大64字 | commit |
description | Skillの機能と使うタイミング(Claude判定の根拠) | Stage and commit the current changes |
when_to_use | 追加のトリガ文脈 | Use when user says "let's commit" |
argument-hint | 補完で出る引数ヒント | [issue-number] |
arguments | 名前付き引数の宣言(位置順にマッピング、本文中の $name プレースホルダで参照) | [issue, branch] |
disable-model-invocation | Claudeからの自動呼び出しを禁止 | true |
user-invocable | /メニューからの手動呼び出しを禁止 | false |
allowed-tools | 起動中に承認なしで使えるツール | Bash(git add *) Bash(git commit *) |
model | このSkill有効中のモデル | sonnet / opus / haiku / inherit |
effort | このSkill有効中のeffortレベル | low / medium / high |
context | 別contextで動かす設定 | fork |
agent | context: fork 時のsubagent type | Explore |
hooks | Skill有効中だけ走るライフサイクルhook(PreToolUse/PostToolUse/Stop 等)。formatは通常のhookと同じ | (hook設定JSON) |
paths | 自動呼び出しを限定するファイルパターン | [src/**/*.ts] |
shell | inline ! 実行のシェル | bash / powershell |
必ず押さえる4軸
description と when_to_use の書き方
descriptionは1,536文字までで切られます。description + when_to_use の合計で skillListingBudgetFraction 設定(デフォルトはコンテキスト窓の1%)を超えると、利用頻度が低いSkillからdescriptionが削られていきます。/doctor で削れているかを確認可能。「最重要のユースケースを先頭に書く」のが定石です。
disable-model-invocation と user-invocable で呼び出し制御
| フロントマター | あなたが呼べる | Claudeが呼べる |
|---|---|---|
| デフォルト | ○ | ○ |
disable-model-invocation: true | ○ | ×(descriptionもcontextに乗らない) |
user-invocable: false | × | ○(背景知識として使われる) |
/deploy や /commit のような「Claudeが勝手に発動してほしくない」副作用つきSkillには disable-model-invocation: true、/legacy-system-context のような「Claudeが必要なときに自動で参照する背景知識」には user-invocable: false を選びます。
allowed-tools で承認スキップを宣言
---
name: commit
description: Stage and commit the current changes
disable-model-invocation: true
allowed-tools: Bash(git add *) Bash(git commit *) Bash(git status *)
---allowed-tools は「このSkillが動いている間は承認なしで使えるツール」を列挙します。プロジェクトの .claude/skills/ に置く場合はworkspace trustダイアログを受諾した後に効きます。リポジトリを信頼するかどうかの判断材料になるので、レビュー対象に含める価値があります。
context: fork で別エージェント実行
---
name: deep-research
description: Research a topic thoroughly
context: fork
agent: Explore
---
Research $ARGUMENTS thoroughly: ...context: fork を付けると、Skillの本文が別のsubagentのシステムプロンプトとして実行されます。agent で実行先subagentを指定可能(Explore / Plan / general-purpose / カスタムsubagent)。長尺の調査・解析をSkill化しつつ、メインcontextを汚さない設計が組めます。
文字列置換変数(運用上の必修知識)
Skill本文には以下のプレースホルダが使えます。手順書型・副作用つきSkillでは特に頻出です。
| 変数 | 展開内容 |
|---|---|
$ARGUMENTS | 呼び出し時の全引数(/fix-issue 123 main なら 123 main) |
$ARGUMENTS[N] / $N | 位置指定(0-indexed)。$0 は最初の引数、$1 は次。複数語は "hello world" のようにquoteで1引数化 |
$name(任意名) | arguments: [issue, branch] のように宣言した場合の名前付き引数。位置順にマッピング($issue = 1番目、$branch = 2番目) |
${CLAUDE_SESSION_ID} | 現在のセッションID(ログファイル命名等に有用) |
${CLAUDE_EFFORT} | 現在のeffortレベル(low / medium / high / xhigh / max) |
${CLAUDE_SKILL_DIR} | この SKILL.md のあるディレクトリ。同梱スクリプトを ${CLAUDE_SKILL_DIR}/scripts/run.py のように参照 |
例:
---
name: fix-issue
description: Fix a GitHub issue by number
disable-model-invocation: true
---
Fix GitHub issue $ARGUMENTS following coding standards.引数を本文中で参照していない場合は、Claude Codeが自動で ARGUMENTS: <入力> を末尾に追記するので、引数が完全に無視されることはありません。
バンドルSkillsと .claude/commands/ の関係
自作する前に、標準で何が提供されているかを押さえておくと選択肢を狭めずに済みます。
バンドルSkills
Claude Codeは /simplify / /batch / /debug / /loop / /claude-api 等のバンドルSkillを全セッションで提供しています(commandsリファレンスにSkillマーク付きで掲載)。多くの組み込みコマンドが固定ロジックなのに対し、バンドルSkillはプロンプトベースでClaudeにツールを使わせる方式なので、自作Skillと同じ感覚で /skill-name で呼べます。
.claude/commands/ からSkillsへの統合
公式は Custom commands have been merged into skills. と明示しています。.claude/commands/deploy.md と .claude/skills/deploy/SKILL.md はどちらも /deploy を作り、同じように動きます。既存の .claude/commands/ ファイルはそのまま動き続けますが、同名でSkillとCommandが両方ある場合はSkillが優先されます。「Skillのほうがディレクトリでサポートファイルを持てる / フロントマターで自動呼び出し制御ができる」ため、新規作成はSkills側を選ぶのが現代の推奨です。
monorepoのnested .claude/skills/
monorepoで packages/frontend/.claude/skills/ のようにnestedに置かれたSkillは、packages/frontend/ 配下のファイルを操作するときにオンデマンドで自動発見されます。--add-dir で追加したディレクトリ内の .claude/skills/ も例外的にロードされる仕様(他の .claude/* は --add-dir ではloadedされない)。リポジトリ全体でSkillを共有しつつ、パッケージ固有のSkillだけはnestedに置く分散運用が可能です。
作成すべき / 作成すべきでない判断軸
Skill化の効果は「反復性 × 手順性」で見ると判断しやすくなります。
| 条件 | 自作する価値 |
|---|---|
| 同じ手順を3回以上呼びたい | ◎ 即作る |
動的データ(git diff / npm test 出力)を毎回Claudeに渡したい | ◎ ! 注入が刺さる |
副作用つき操作を /コマンド 化したい(/deploy /commit) | ◎ disable-model-invocation 必須 |
| プロジェクト固有の規約(API命名 / コミットメッセージ等) | ◎ パスパターン併用が有効 |
| 1回限りの相談 | × ペーストで十分 |
| 常時効かせたい固定の前提(言語・スタイル方針) | △ CLAUDE.mdのほうが軽い |
| 長大な調査タスク | △ Subagent化or context: fork を検討 |
| 動的判断ループが必要 | × Subagentのほうが向く |
Skills vsその他レイヤの使い分け
「SkillかCLAUDE.mdかSubagentかMCPか」は混乱しがちです。「いつ何がcontextに入るか」で見ると整理できます。
| 仕組み | context投入タイミング | 投入後の動き | 主な役割 |
|---|---|---|---|
| CLAUDE.md | セッション開始時(常時) | 全期間で居座る | 固定の前提・規約 |
| Skills | 呼ばれた瞬間(自動or手動) | 呼ばれた以降はsession中ずっと居座る | 反復手順・動的注入 |
| Subagents | サブセッション内のみ | メイン会話には要約だけ返る | 委譲・専門領域 |
| MCP | サーバ接続時にツール一覧が入る | 必要時にツール呼び出し | 外部システム連携 |
同じ知識をCLAUDE.mdとSkillのどちらに書くか
| 知識の性質 | 置き場所 |
|---|---|
| 常に効く前提(命名規則・ライセンス方針・敬体vs常体) | CLAUDE.md |
| 特定の操作で必要な手順(リリースノート作成・PRレビュー) | Skill(手順書型) |
ファイル種類で出し分けたい規約(.tsx だけに効く規則) | Skill + paths パターン |
| 動的情報が必要な手順 | Skill + ! 注入 |
「毎ターン読まれる必要があるか」が分岐基準です。読まれる必要があるならCLAUDE.md、特定の場面でだけ読まれれば十分ならSkill。
Skills vs Subagents
| 観点 | Skills | Subagents |
|---|---|---|
| 実行context | メイン会話 | 独立サブセッション |
| 出力の戻り方 | メイン会話に直接反映 | 要約だけ戻る |
| 適しているタスク | 短〜中尺の手順・チェックリスト・参照知識 | 長尺の調査・並列実行・権限制限 |
| 主なROI | 反復性 | コンテキスト分離 |
「メイン会話の中で何かを完了させたい」ならSkill、「メイン会話を汚さず別contextで完了させたい」ならSubagent。両者の組み合わせとして、Subagentの skills フィールドでSkill内容を起動時にcontextへ注入する設計もできます。Subagentの自作判断はサブエージェント作成ガイドで扱っています。
失敗パターンと回避策
1. description が抽象的すぎて呼ばれない
description: Helper for git のような曖昧な説明だとClaudeが文脈一致を判断できません。「いつ・何を・どう判定するか」を1,536字以内で先頭に書きます。トリガフレーズ(「コミットしたい」「diffを見たい」)を入れると自動呼び出しが効きやすくなります。
2. SKILL.mdが肥大化(500行超え)
公式は Keep SKILL.md under 500 lines. を推奨。500行を超えるとinvoke時のcontext圧迫が大きくなります。長尺の参照資料は同ディレクトリ内の別ファイル(reference.md / examples.md)に切り出し、SKILL.mdから「必要時にReadしてください」と参照させる形が定石です。
3. invoke後にコンテキストに居座り続ける
Skill本文は一度invokeされるとセッション中ずっとcontextに残ります。Auto compaction後でも各Skillの先頭5,000トークンまでが再注入されますが、複数Skill間で合計25,000トークンの共有予算になっており、最近invokeしたSkillから順に埋まります。古いSkillはcompaction後にまるごとdroppedされることもある仕様です。長尺Skillを1セッションに多数invokeすると累積でcontextを食うので、呼ぶたびに必要な本文だけにする / 参照を別ファイルに切る設計が安全です。
4. disable-model-invocation 漏れによる事故
/deploy のような副作用つきSkillから disable-model-invocation: true が抜けていると、Claudeが「コードが完成したからdeployしよう」と判断して勝手に発動する可能性があります。副作用がある全Skillにこのフラグを付ける運用を徹底します。
5. allowed-tools の過剰許可
allowed-tools: Bash だけ書くとすべてのBashコマンドが承認なしに実行可能になります。Bash(git add *) Bash(git commit *) のようにサブコマンドまで明示するのが安全。Bash(rm *) のような破壊的操作は絶対に明示許可しない。
6. CLAUDE.mdとSkillの重複
「コミットメッセージは日本語で書く」をCLAUDE.mdと /commit の両方に書くと、片方更新が漏れたときに矛盾が出ます。重複が見つかったらCLAUDE.md側に統一(常時効く前提なので)、Skill側はリンクで参照する設計に倒すのが運用上のセオリーです。
トラブルシューティング(公式記載のチェック項目)
公式 /doctor で診断できる主な観点を挙げます。
- Skillが呼ばれない →
descriptionの具体性 /What skills are available?で表示されるか - 逆に呼ばれすぎる →
descriptionを狭く /disable-model-invocation: trueを検討 - descriptionが途中で切れている →
skillListingBudgetFractionでcontext予算を増やすか、skillOverridesで利用頻度の低いSkillをname-onlyに格下げ - Skill編集が反映されない → 親ディレクトリの
.claude/skills/をライブ監視する仕様。新規ディレクトリ作成時はセッション再起動が必要
skillOverrides で個別Skillの表示状態を制御する
.claude/settings.local.json の skillOverrides で、各Skillの見え方を4段階で制御できます。/skills メニューで対象Skillをハイライトし Space キーで循環、Enter で保存できます。
| 値 | Claudeへのlisting | / メニュー |
|---|---|---|
"on"(デフォルト) | name + description | 表示 |
"name-only" | nameのみ | 表示 |
"user-invocable-only" | hidden | 表示(あなただけ呼べる) |
"off" | hidden | hidden |
{
"skillOverrides": {
"legacy-context": "name-only",
"deploy": "off"
}
}Bundled / Managed / Plugin Skillsは skillOverrides の対象外です(プラグインは /plugin で管理)。
Skill別に許可 / 拒否するpermission rules
/permissions でSkill単位の許可・禁止を書けます。
# 特定Skillだけ許可
Skill(commit)
Skill(review-pr *)
# 特定Skillを禁止
Skill(deploy *)Skill(name) は完全一致、Skill(name *) は前方一致(引数付きで呼ばれてもマッチ)。disable-model-invocation: true はfrontmatterでSkill自身が宣言する方式、Skill(name) のpermission ruleはsettingsで外側から制御する方式と位置付けが違います。
disableSkillShellExecution で ! 注入を全停止
managed settingsで "disableSkillShellExecution": true を設定すると、!`<command>` のシェル注入をポリシーで全停止できます(Bundled / Managed Skillsは影響を受けない)。企業環境で「外部のSkillにシェルを走らせたくない」要件があるときに使います。
まとめ
Skills自作のROIは「手順反復性 / 動的データ注入 / 副作用つき操作のコマンド化 / プロジェクト規約の適用範囲制御」のいずれかに該当するかで決まります。
- 最小単位は
.claude/skills/<name>/SKILL.mdのYAMLフロントマター + Markdown本文 - スコープはEnterprise > Personal > Projectの優先順位
- 効くフィールドは
description/disable-model-invocation/allowed-tools/context: fork - CLAUDE.mdは常時 / Skillは呼び出し時 / Subagentは別context、と投入タイミングで使い分ける
- 「手順反復 + 動的データ + 副作用つき操作」のいずれかが当てはまるSkillから作り始めると効果が出やすい
書き方の具体パターンはSkillsの書き方5パターン集、設計思想の背景はAgent Skillsとは何か、SkillかSubagentかの判断軸はサブエージェント作成ガイド、CLAUDE.md・Settingsとの関係はClaude Codeのメモリ三層構造も合わせて参照してください。
関連する記事
Claude Code をもっと見る →Claude Codeのサブエージェントを作る — 作成ナレッジとメリット・デメリット
Claude Codeのサブエージェント完全活用 — Taskツールで作る並列開発パターン
Claude Codeのメモリ三層構造 — CLAUDE.md/Settings/Skillsの使い分け
Claude Codeとは — Anthropicのエージェント型AIコーディングCLI完全ガイド
Anthropic「Trustworthy Agents in Practice」— エージェント5原則と落とし所
Claude Code v2.1.19 — 新しいタスクシステムへ移行、AVX非対応CPUクラッシュも修正
MCPでコード実行する設計 — Anthropicが示す「ツール呼び出し」から「コードAPI」への移行
Agent Skillsとは何か — Anthropicが示した「エージェントに業務知識を持たせる」最小単位