Claude Code特集:mdファイルの書き方とサンプル集
Claude Code は、プロジェクトに置いたMarkdownファイルやJSONファイルを読んで動き方を変えます。このページでは、基本の CLAUDE.md から、スキル、サブエージェント、Hooks、MCPサーバーまで、それぞれの置き場所・書き方のコツ・そのまま使えるサンプルをまとめました。
2026年10月時点の公式ドキュメントをもとにしています。サンプルの多くは、このサイト(Keep Up With AI)の開発で使う想定で書いています。
1. 全体像と使い分け
どれも「Claude にどう動いてほしいか」を書くものですが、読み込まれるタイミングと強制力が違います。迷ったら次の表で選んでください。
| やりたいこと | 使うもの | 置き場所 | 読み込まれるとき |
|---|---|---|---|
| 毎回守ってほしい前提・ルールを伝える | CLAUDE.md | CLAUDE.md | セッション開始時に毎回 |
| 特定のファイルを触るときだけのルール | rules | .claude/rules/*.md | 該当ファイルを扱うとき |
| 決まった作業手順を呼び出せるようにする | スキル | .claude/skills/名前/SKILL.md | /名前 で呼んだとき、または Claude が必要と判断したとき |
| 調査やレビューを別の担当に任せる | サブエージェント | .claude/agents/名前.md | 作業を任せるとき(会話とは別の文脈で動く) |
| 必ず実行したい処理・禁止したい操作 | Hooks | .claude/settings.json | ツールの実行前後など決まったタイミングで必ず |
| 外部サービス(Notion、DBなど)とつなぐ | MCPサーバー | .mcp.json | 起動時に接続し、ツールとして使う |
ポイント CLAUDE.md・rules・スキルは「お願い」で、Claude が従わないこともあります。絶対に守らせたいこと(秘密ファイルを編集させない、など)は Hooks で止めます。
your-project/
├── CLAUDE.md # プロジェクトの説明書(チームで共有)
├── CLAUDE.local.md # 自分だけのメモ(.gitignore に入れる)
├── .mcp.json # MCPサーバーの設定(チームで共有)
└── .claude/
├── settings.json # 権限・Hooks などの設定(チームで共有)
├── settings.local.json # 自分だけの設定
├── rules/ # 分野別のルール(CLAUDE.md の分割)
│ └── templates.md
├── skills/ # スキル(手順書)。/スキル名 で呼べる
│ └── update-pricing/
│ └── SKILL.md
├── agents/ # サブエージェント
│ └── code-reviewer.md
└── hooks/ # Hooks から呼ぶスクリプト
└── protect-files.sh
~/.claude/ # 自分のPC全体(すべてのプロジェクト)に効く
├── CLAUDE.md
├── settings.json
├── skills/
└── agents/
プロジェクト内の .claude/ はGitでチームと共有できます。~/.claude/ に置いたものは、自分のPCのすべてのプロジェクトに効きます。
2. CLAUDE.md の基本
CLAUDE.md は、Claude がセッションの最初に必ず読む「プロジェクトの説明書」です。毎回口頭で説明していることを書いておく場所だと考えてください。まずは /init を実行すると、コードを読んだ Claude がひな形を作ってくれます。
| 置き場所 | 効く範囲 | 書く内容の例 |
|---|---|---|
| ~/.claude/CLAUDE.md | 自分のすべてのプロジェクト | 好みの書き方、返答は日本語で、など |
| ./CLAUDE.md | このプロジェクト(チームで共有) | ビルド・テストのコマンド、構成、コーディング規約 |
| ./CLAUDE.local.md | このプロジェクトの自分だけ | 手元の検証用URLなど。.gitignore に入れる |
複数ある場合は上書きではなく、すべてが連結されて読まれます。サブフォルダの CLAUDE.md は、そのフォルダのファイルを扱ったときに追加で読まれます。
書き方のコツ
- 確かめられるくらい具体的に書く。「きれいに整形する」ではなく「インデントは半角スペース2つ」、「テストする」ではなく「コミット前に
npm testを実行する」。 - 200行以内を目安にする。長いほど文脈を消費し、守られにくくなります。一部のファイルにしか関係しないルールは、次の rules に分けます。
- 見出しと箇条書きで整理する。長い文章より、まとまった箇条書きの方が従われやすくなります。
- 矛盾をなくす。指示同士が食い違うと、Claude はどちらか一方を選んでしまいます。ときどき見直して古い指示を消してください。
- コードを読めば分かることは書かない。書くのは、コマンド、触ってはいけない場所、チームの約束ごとなど、コードからは分からないことです。
@パスで別ファイルを取り込める。README などを二重に書かずに済みます。ただし取り込んだファイルも起動時に全部読まれるので、文脈の節約にはなりません。
# Keep Up With AI
AI企業の公式発表をRSSで集め、Claude APIで日本語3行に要約し、静的サイトとして公開する。
## よく使うコマンド
- 手元で確認: `python run.py --feed tests/sample_feed.xml --dry-run --data /tmp/test.json --serve`
- ページだけ作り直す: `python run.py --build-only --serve`(http://localhost:8000/)
- `public/` は生成物。直接編集しない(テンプレートは `templates/`、CSSは `static/style.css`)
## 構成
- 収集 `aicatchup/collect.py` → 要約 `aicatchup/summarize.py` → HTML生成 `aicatchup/build.py`
- 記事データは `data/articles.json`(GitHub Actions が自動でコミットする。手で編集しない)
- 設定は `config.yaml`、広告は `affiliates.yaml`、料金比較は `pricing.yaml`
## ルール
- 画面に出す文言・コメントは日本語で書く
- URLは拡張子なし(`/about`)。リンクは `{{ root_path }}` から始める
- 広告枠には必ず「PR」を表示する(ステマ規制対応)。外さない
- 元記事の本文は取得・保存しない。RSSの抜粋とメタ情報だけを使う
## 詳しい資料
- 公開手順と運用: @README.md
読み込まれたかどうかは、セッション中に /context を実行すると確認できます。
3. ルールの分割(.claude/rules)
CLAUDE.md が長くなったら、テーマごとに .claude/rules/ の下へ分けます(testing.md、api-design.md など)。先頭に paths を書くと、そのパターンに合うファイルを扱うときだけ読み込まれ、文脈を節約できます。
---
paths:
- "templates/**/*.html"
- "static/**/*.css"
---
# テンプレートとCSSのルール
- 色は `static/style.css` の `:root` にある変数(`--ink`, `--accent` など)だけを使う
- ダークモードでも読めるか、`prefers-color-scheme: dark` の値も確認する
- スマホ幅(400px)で横スクロールが出ないようにする。表は `.table-scroll` で囲む
- 新しいページは `build.py` の `page()` で出力する(sitemap に自動で載る)
paths を書かないルールは、CLAUDE.md と同じく毎回読み込まれます。
4. スキル(SKILL.md)
スキルは「手順書」です。.claude/skills/スキル名/SKILL.md に置くと /スキル名 で呼び出せるほか、Claude が説明文を見て必要なときに自分で読み込みます。普段は説明文だけが読まれ、本文は使うときに初めて読まれるので、CLAUDE.md より文脈を圧迫しません。以前のカスタムコマンド(.claude/commands/)はスキルに統合され、そのまま動きます。
| 項目(frontmatter) | 意味 |
|---|---|
| description | 何をするスキルで、いつ使うか。Claude はこれだけを見て使うかどうかを決めます(実質必須) |
| name | 呼び出し名。省略するとフォルダ名 |
| argument-hint | 入力補完に出す引数のヒント。本文では $ARGUMENTS で受け取る |
| disable-model-invocation | true で、Claude が勝手に使わず /名前 で呼んだときだけ動く。デプロイなど副作用のある作業向け |
| allowed-tools | スキル実行中、確認なしで使ってよいツール |
| context | fork でサブエージェントとして別の文脈で実行 |
| paths | このパターンのファイルを扱うときだけ自動で読み込む |
書き方のコツ
- description の最初に用途を書く。「〜するとき使う」と、頼まれ方の例も入れると呼ばれやすくなります。
- 本文は説明ではなく指示にする。読み込まれた本文は会話中ずっと文脈に残るので、やることを短く書きます。
- 副作用のある作業は
disable-model-invocation: true。デプロイやメッセージ送信を Claude の判断で始めさせないためです。 - 許可は狭く。
Bash(git diff *)のように、必要なコマンドだけを許可します。 - SKILL.md は500行以内。詳しい資料は同じフォルダの別ファイル(
reference.mdなど)に分け、SKILL.md から「〜のときは reference.md を読む」と案内します。 - 新しいセッションで試す。作っている最中の会話の文脈があると、手順の抜けに気づけません。
次の例は !`コマンド` の書き方で、スキルを読み込む前にコマンドを実行し、その結果(ここでは差分)を本文に埋め込みます。
---
description: コミットしていない変更を要約し、危なそうな点を指摘する。「何を変えた?」「コミットメッセージを考えて」「差分を見て」と頼まれたときに使う。
allowed-tools: Bash(git diff *) Bash(git status *)
---
## 現在の変更
!`git diff HEAD`
## 手順
1. 上の差分を箇条書き2〜3行で要約する
2. エラー処理の漏れ、値の直書き、更新が必要なテストなど、気になる点を挙げる
3. 差分が空なら「コミットしていない変更はありません」とだけ答える
次の例は引数を受け取り、/update-pricing と打ったときだけ動くスキルです。
---
description: pricing.yaml の料金を各社の公式ページで確認して更新する。料金比較ページの更新を頼まれたときに使う。
argument-hint: "[サービス名(省略すると全サービス)]"
disable-model-invocation: true
allowed-tools: Read Edit WebFetch
---
# 料金表の更新
対象: $ARGUMENTS(空なら pricing.yaml の全サービス)
1. `pricing.yaml` を読み、対象サービスの `sources` のURLを開く
2. 月額プランとAPI料金(100万トークンあたりの入力・出力)を公式ページの値と照らし合わせる
3. 違う値だけを書き換える。公式ページで確認できた項目は `verified: true` にする
4. 公式ページが開けない・値が見つからない項目は書き換えず、`verified: false` のままにする
5. `checked` を今日の日付にする
6. 最後に、変えた項目を「サービス / 項目 / 旧 → 新」の表で報告する
比較記事やまとめサイトの値で書き換えないこと。
5. サブエージェント
サブエージェントは、作業を任せられる「別の担当者」です。会話とは別の文脈で動き、結果の要約だけを返すので、テストのログや大量の検索結果でメインの会話が埋まりません。.claude/agents/(プロジェクト)か ~/.claude/agents/(自分用)にMarkdownで置き、/agents からも作れます。
| 項目(frontmatter) | 意味 |
|---|---|
| name | 識別名(必須) |
| description | どんなときに任せるか(必須)。Claude はこれを見て任せる相手を選びます |
| tools | 使ってよいツールの一覧。省略するとすべて使える |
| model | haiku / sonnet / opus / inherit(会話と同じ)など |
| permissionMode | 権限の確認方法(plan で読み取り専用の計画モードなど) |
| skills / mcpServers / hooks | このサブエージェントだけに持たせるスキル・MCPサーバー・Hooks |
| isolation | worktree で一時的なGitのworktreeで作業させる |
書き方のコツ
- description は具体的に、短く。「use proactively(積極的に使う)」と入れると、頼まなくても任せるようになります。詳しい指示は本文へ。
- ツールは最小限。レビュー役なら
Read, Grep, Globのように読むだけに絞ると安全です。 - 単純な作業は安いモデルへ。検索や仕分けは
model: haikuで十分です。 - 必要な情報は本文に書く。サブエージェントはこれまでの会話を知りません。何を見て、何をどんな形で返すかを書いておきます。
- 返す形を決めておく。「失敗だけを3行で」のように決めると、メインの会話に戻る情報が短くなります。
- agents フォルダを新しく作ったら再起動。既にあるフォルダの変更は自動で反映されます。
---
name: code-reviewer
description: コードの変更をレビューする専門家。コードを書いたり直したりした直後に、積極的に(use proactively)使う。
tools: Read, Grep, Glob, Bash
model: sonnet
---
あなたはこのプロジェクトのシニアエンジニアとしてコードレビューを行う。
呼ばれたら:
1. `git diff` で変更点を確認する
2. 変更されたファイルを中心に読む
3. すぐにレビューを始める
確認すること:
- 動作の誤り(境界値、空のデータ、例外処理)
- 秘密情報(APIキーなど)の直書き
- 既存の書き方や命名とのずれ
- テストや README の更新漏れ
報告の形:
- 「必ず直す」「直した方がよい」「検討」の3段階に分ける
- 各項目に `ファイル名:行番号` と、具体的な直し方を書く
- 問題がなければ「指摘なし」とだけ書く。ファイルは編集しない
---
name: test-runner
description: テストを実行して失敗だけを報告する。テストの実行や、失敗の原因調査を頼まれたときに使う。
tools: Bash, Read, Grep
model: haiku
---
テストを実行し、結果を短く報告する。
1. テストを実行する(コマンドは CLAUDE.md の「よく使うコマンド」に従う)
2. すべて通ったら「全件成功(件数)」とだけ報告する
3. 失敗があれば、失敗ごとに次の3行だけを返す
- テスト名
- エラーメッセージの要点(1行)
- 原因と思われる箇所(`ファイル名:行番号`)
ログ全文は返さない。コードは修正しない。
6. Hooks
Hooks は、決まったタイミングで必ず実行されるシェルコマンドです。CLAUDE.md の指示と違い、Claude の判断に関係なく動きます。settings.json の hooks に書きます。
| よく使うイベント | 動くタイミング | 使い道の例 |
|---|---|---|
| PreToolUse | ツールを実行する前(止められる) | 保護ファイルの編集や危険なコマンドを止める |
| PostToolUse | ツールが成功した後 | 編集したファイルを自動で整形する |
| UserPromptSubmit | プロンプトを送った直後 | 毎回の前提情報を足す |
| Notification | Claude が通知を出すとき | 入力待ちをデスクトップ通知で知らせる |
| Stop | Claude が返答を終えたとき | テストを走らせる、完了を通知する |
| SessionStart | セッションの開始・再開時 | 環境変数を読み込む、最新の状況を伝える |
ほかにも SubagentStop、PreCompact、SessionEnd など、全部で30以上のイベントがあります(一覧)。
書き方のコツ
matcherで対象を絞る。"Edit|Write"のように書くと、ファイル編集のときだけ動きます。空なら毎回動きます。- 終了コードで結果を伝える。0 は成功(そのまま続行)、2 は止める。2 のときに標準エラーへ書いた理由は Claude に伝わり、別のやり方を考えます。
- 入力はJSONで標準入力に届く。編集対象のファイル名は
.tool_input.file_pathにあるので、jqで取り出します。 - 長い処理はスクリプトに分ける。
.claude/hooks/に置き、"$CLAUDE_PROJECT_DIR"からのパスで呼びます。macOS・Linux ではchmod +xが必要です。 - 置き場所で効く範囲が変わる。
~/.claude/settings.jsonは全プロジェクト、.claude/settings.jsonはチームで共有、.claude/settings.local.jsonは自分だけ。
{
"hooks": {
"PreToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/protect-files.sh"
}
]
}
],
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "jq -r '.tool_input.file_path' | xargs npx prettier --write"
}
]
}
]
}
}
#!/bin/bash
# 編集されたくないファイルへの Edit / Write を止める
INPUT=$(cat)
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')
# Windows の区切り文字 \ を / にそろえる
FILE_PATH="${FILE_PATH//\//}"
PROTECTED_PATTERNS=(".env" "package-lock.json" ".git/" "data/articles.json")
for pattern in "${PROTECTED_PATTERNS[@]}"; do
if [[ "$FILE_PATH" == *"$pattern"* ]]; then
echo "Blocked: $FILE_PATH は保護されています('$pattern')" >&2
exit 2 # 2 で終わると操作を止め、この理由が Claude に伝わる
fi
done
exit 0
この例では jq と Prettier を使います。Hooks は自分の権限でコマンドを実行するので、他人が書いた設定は中身を確認してから使ってください。
7. MCPサーバー
MCP(Model Context Protocol)サーバーをつなぐと、Claude が Notion・データベース・社内APIなどを道具として使えるようになります。追加は claude mcp add コマンドで行い、チームで共有するものは .mcp.json に書きます。
# リモート(HTTP)のサーバーを追加する
claude mcp add --transport http notion https://mcp.notion.com/mcp
# 手元で動かす(stdio)サーバーを追加する。-- の後ろがサーバーの起動コマンド
claude mcp add --env AIRTABLE_API_KEY=YOUR_KEY --transport stdio airtable \
-- npx -y airtable-mcp-server
# チームで共有する(.mcp.json に書き込まれる)
claude mcp add --transport http notion --scope project https://mcp.notion.com/mcp
# 確認・削除
claude mcp list
claude mcp get notion
claude mcp remove notion
| スコープ | 保存先 | 共有 |
|---|---|---|
| local(初期値) | ~/.claude.json(プロジェクトごと) | 自分だけ・このプロジェクトだけ |
| project | .mcp.json | Gitでチームと共有 |
| user | ~/.claude.json | 自分のすべてのプロジェクト |
{
"mcpServers": {
"notion": {
"type": "http",
"url": "https://mcp.notion.com/mcp"
},
"api-server": {
"type": "http",
"url": "${API_BASE_URL:-https://api.example.com}/mcp",
"headers": {
"Authorization": "Bearer ${MY_API_KEY}"
}
},
"airtable": {
"type": "stdio",
"command": "npx",
"args": ["-y", "airtable-mcp-server"],
"env": {
"AIRTABLE_API_KEY": "${AIRTABLE_API_KEY}"
}
}
}
}
書き方のコツ
- APIキーは直接書かず
${変数名}で。${変数名:-初期値}で、未設定のときの値も決められます。 - URLで接続するサーバーには
"type": "http"を必ず書く。typeが無いと手元で起動するサーバーとみなされ、読み込まれません。 ANTHROPIC_API_KEYなどの名前は使わない。リモートのurl・headersでは空になるため、自分で付けた名前の変数に入れ直します。- 状態の確認は
/mcp。OAuth での認証もここから行います。 - 共有された .mcp.json のサーバーは、初回に使ってよいか確認が出ます。知らないサーバーは承認しないでください。
公式ドキュメント
Claude の料金プランやAPI料金はAIサービス料金比較にまとめています。