本文へスキップ
Claude Media
Claude Code Skillsの作り方と使い分け — 最小単位・運用ROI・他レイヤ比較

Claude Code Skillsの作り方と使い分け — 最小単位・運用ROI・他レイヤ比較

Claude Code SkillsをSKILL.mdで作成・運用するときの最小単位・メリット/デメリット・他レイヤ(CLAUDE.md/Subagents/MCP)との使い分け・失敗パターンを整理します。

読了目安 約20

この記事で扱うこと

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.md

SKILL.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
descriptionSkillの機能と使うタイミング(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-invocationClaudeからの自動呼び出しを禁止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
agentcontext: fork 時のsubagent typeExplore
hooksSkill有効中だけ走るライフサイクルhook(PreToolUse/PostToolUse/Stop 等)。formatは通常のhookと同じ(hook設定JSON)
paths自動呼び出しを限定するファイルパターン[src/**/*.ts]
shellinline ! 実行のシェルbash / powershell

必ず押さえる4軸

descriptionwhen_to_use の書き方

descriptionは1,536文字までで切られます。description + when_to_use の合計で skillListingBudgetFraction 設定(デフォルトはコンテキスト窓の1%)を超えると、利用頻度が低いSkillからdescriptionが削られていきます。/doctor で削れているかを確認可能。「最重要のユースケースを先頭に書く」のが定石です。

disable-model-invocationuser-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

観点SkillsSubagents
実行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.jsonskillOverrides で、各Skillの見え方を4段階で制御できます。/skills メニューで対象Skillをハイライトし Space キーで循環、Enter で保存できます。

Claudeへのlisting/ メニュー
"on"(デフォルト)name + description表示
"name-only"nameのみ表示
"user-invocable-only"hidden表示(あなただけ呼べる)
"off"hiddenhidden
{
  "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: truefrontmatterで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のメモリ三層構造も合わせて参照してください。

この記事を共有:XLinkedIn