
シリーズ: Claudeで変わる仕事術 中級・第6弾(実践) / 前回:中級・第5弾 MCPで外部ツールとつなぐ実践ガイド
中級編で、5つの武器を手に入れた。
第1弾でSKILLS。 第2弾でGit。 第3弾でSubAgent。 第4弾でHook。 第5弾でMCP。
どれも単体では使えるようになった。
Gitは今回のフローには直接出てこないが、SkillファイルやCLAUDE.mdをバージョン管理して育てていくときに必須になる。
今回は、全部をつなぐ。
テーマは、初級第4弾でやった経費精算だ。
あのとき、「領収書の写真をClaude Codeに読ませて、CSVを作る」を体験した。
あれは便利だった。
でも、毎回Claudeに「領収書を読んで」「チェックして」「Slackに送って」と順番に頼むのは、まだ半手動だ。
一度設計してしまえば、次からは一行で動く。
それが中級の仕組みだ。
1. 武器の置き場所を整理する
5つの武器を使えるようになると、次の問題が出てくる。
「どこに何を書けばいいのか」
毎回守ってほしいことはCLAUDE.mdなのか。 繰り返す作業はSkillなのか。 自動チェックはHookなのか。
ここが曖昧だと、仕組みが散らかる。
まず整理する。

| 仕組み | 役割 | 経費精算での使い方 |
|---|---|---|
| CLAUDE.md | プロジェクト全体の前提 | 申請者情報、費目分類ルール、通知先チャンネル |
| Skill | 複数ステップの仕事の型 | 経費精算フロー全体(/expense-check) |
| SubAgent | 独立した作業を並列実行 | 同じ処理を複数並行(6枚同時読み取り)、違う処理を同時実行(費目チェック+必須項目確認) |
| Hook | タイミングで走る自動確認 | CSV完成後の「要確認」フラグ検出 |
| MCP | 外部ツールとの連携 | Slack完了通知 |
大事なのは、同じ情報をあちこちに書かないこと。
あとで矛盾する。
2. CLAUDE.mdに書くもの
CLAUDE.mdは、毎回必要な前提を書く場所だ。
初級第4弾で、経費精算の設定をCLAUDE.mdに保存した。
## 経費精算 — 申請者情報
| 項目 | 値 |
|------|-----|
| 申請者名 | 山田 太郎 |
| 社員番号 | EMP-00456 |
| 所属部署 | 営業部 |
| 承認者 | 田中 部長 |
## 費目分類ルール
| 費目 | 内容 |
|------|------|
| 交通費 | タクシー・MRT・電車・バスなど |
| 宿泊費 | ホテル・宿泊施設 |
| 交際費 | 接待・会食(複数人) |
| その他 | 印刷・個人の食事・消耗品 |
## Slack通知設定
- 通知先チャンネル:#経費精算
これは正しい置き場所だ。
申請者情報も費目分類ルールも、毎回必要な前提だからCLAUDE.mdに書く。
逆に、こういうものはCLAUDE.mdに書かない。
| 書く | 書かない |
|---|---|
| 申請者情報(名前・社員番号) | 今回の出張先 |
| 費目分類ルール | その月の為替レート |
| 経理システムのURL | 今回の経費合計 |
| Slackの通知先チャンネル | 一時的なメモ |
CLAUDE.mdは厚くしすぎない。
毎回読む前提だから、必要なものだけ書く。
判断基準は単純だ。「その情報を、別の仕事でも使うか」。
経費精算だけで使うルールならSkill内に書けばいい。でも申請者情報や費目分類は、請求書作成でも出張申請でも使う。だからCLAUDE.mdに置く。

3. Skillに書くもの
Skillは、複数ステップの仕事の型だ。
.claude/skills/ フォルダの中に、Skill名のフォルダを作り、その中に SKILL.md を置く。
フォルダ名がそのままコマンド名になる。
.claude/
└── skills/
└── expense-check/
└── SKILL.md → /expense-check で呼び出す
経費精算フローなら、こういう手順をまとめる。
- 領収書を読み取る
- CSVを生成する
- 金額・費目をチェックする
- 申請書の必須項目を確認する
- エラーがあれば通知する
- 完了をSlackに送る
6ステップあっても、/expense-check の一行で全部動く。
読み取りとCSV生成は密接に関係するので、同じSubAgentが担当する。ステップの数とSubAgentの数は一致しなくていい。役割でまとめるのが基本だ。
毎回手順を説明しなくていい。 毎回同じ品質で動く。
それがSkillの価値だ。
4. SubAgentの役割を決める
SubAgentは、独立した作業を同時に走らせる仕組みだ。
並列にできるのは2パターンある。
パターン1:同じ処理を複数並行
経費精算で6枚の領収書があるとき、1枚ずつ順番に読むと6回分の時間がかかる。SubAgentに分けると、6枚が同時に読まれる。
パターン2:違う処理を同時実行
「費目が正しいかチェック」と「必須項目が揃っているか確認」は、互いに関係がない。どちらもCSVを読むだけで判断できる。だから同時に走らせられる。

ただし、何でも並列にできるわけではない。
| 並列OK | 順番が必要 |
|---|---|
| 互いに関係のない作業 | 前の結果を使う作業 |
| 6枚の領収書を同時読み取り | CSVが完成してからチェック |
| 費目チェックと必須項目確認 | 読み取りが終わってから集計 |
依存関係のある作業は、順番に処理する。
依存関係のない作業は、並列に処理する。
これがSubAgentを設計するときの基本だ。
SubAgentに設定ファイルはない HookはPythonスクリプトと
settings.jsonが必要で、SkillはSKILL.mdが必要だ。でもSubAgentは違う。SKILL.mdの中に「並列で処理して」と書くだけで、Claudeが実行時に自動でSubAgentを起動する。SubAgentは実行中にだけ存在し、ファイルとしての実体はない。
5. Hookの役割を決める
Hookは、タイミングで自動的に走る確認だ。
経費精算での役割はこれだ。
CSVが完成したあと、「要確認」フラグが付いた行がないかを検出する。
ただし、「この領収書の読み取りが怪しい」という判断はHookにはできない。
判断はClaude(Skill内)がやる。
Hookは、ClaudeがCSVに書き込んだフラグを見て、止めるか通知するだけだ。
| 役割 | 担当 |
|---|---|
| 「読み取りが不確か」の判断 | Claude(Skill内) |
| 「要確認フラグがあるか」の検出 | Hook |
| フラグがある場合に止める | Hook |
ここを混同しない。
6. 実践:経費精算フローを設計する
ここから実践だ。
初級第4弾では、毎回こう頼んでいた。
@receipts/ フォルダの領収書を全部読んで、
経費精算の明細を作ってください。
中級では、これをSkillとして型化する。
そのSkillの中で、SubAgent・Hook・MCPが役割を分担する。
フローの全体像

/expense-check を起動(Skill)
│
▼
SubAgent①:receipts/ フォルダの領収書を並列で一斉読み取り
→ expense_report.csv を生成
→ 読み取りが不確かな行に「要確認」フラグを付ける
│
│ ← ①の完了を待つ(CSVが存在しないとチェックできないため)
▼
SubAgent②:金額・費目の妥当性チェック ┐
SubAgent③:申請書の必須項目の漏れ確認 ┘ ←この2つは並列OK
│
│ ← ②③の完了を待つ
▼
Hook:expense_report.csv の「要確認」フラグを検出
→ あれば止めて人間に確認を促す
→ なければ次へ
│
▼
MCP(Slack):完了通知を#経費精算チャンネルに送信
SubAgent①が終わらないと②③は始められない。
でも②と③は互いに独立しているので、同時に走らせられる。
②と③は独立しているから並列に。①→②③は依存があるから順番に。
Skillの作り方
Claude Codeにこう頼む。
経費精算の処理をSkillとして設計したいです。
フローはこのとおりです:
1. receipts/ フォルダの領収書を読み取る(複数枚を並列処理)
2. 読み取り結果からCSVを生成する
- 読み取りが不確かな行には「要確認」フラグを付ける
3. CSVが完成したら(2の完了を待ってから):
- SubAgent②:金額・費目の妥当性チェック
- SubAgent③:CLAUDE.mdの申請者情報・必須項目の漏れ確認
(②と③は並列で走らせる)
4. 「要確認」フラグを検出するHookを settings.json に設定する
5. 問題なければMCP経由でSlackに完了通知を送る
まず設計案だけ出してください。
いきなりファイルは作らないでください。
「まず設計案だけ」を入れるのが大事だ。
Skillも、設計を確認してから作る。
SubAgent①の動き
SubAgent①は、領収書を並列で読み取る。
6枚の写真があれば、6つのSubAgentが同時に走る。
1枚ずつ順番に読むより、処理時間が大幅に短くなる。
出力はCSVだ。読み取りに自信がない行には「要確認」フラグが付く。
(為替レート:1 SGD = 117円で計算)
日付,内容,外貨金額,外貨,日本円,費目,フラグ
2026-06-10,Changi空港→ホテル タクシー,35.00,SGD,4095,交通費,
2026-06-11,MRT往復,4.80,SGD,562,交通費,
2026-06-11〜12,Marina Bay Hotel 2泊,480.00,SGD,56160,宿泊費,要確認
2026-06-10,Mr. Tan 夕食(3名),180.00,SGD,21060,交際費,
2026-06-11,昼食,18.50,SGD,2165,その他,
2026-06-11,プレゼン資料印刷,12.00,SGD,1404,その他,
「要確認」が付いた行は、写真がぼけていたか、金額の読み取りに自信がなかった行だ。
全部を見直す必要はない。
このフラグが付いた1行だけ目視確認すればいい。
SubAgent②③の動き(①完了後)
SubAgent①のCSVが完成したら、②と③が同時に走る。
SubAgent②:金額・費目チェック
- 費目がCLAUDE.mdの分類ルールに合っているか
- 交際費に人数の記載があるか
- 金額が極端に大きくないか(誤読の可能性)
SubAgent③:必須項目の確認
- 申請者名・社員番号・承認者が入っているか
- 経費の対象期間が明記されているか
- 合計金額が計算されているか
どちらもCSVを読むだけで判断できる。 互いに関係がないので、並列で走らせる。
②③が問題を検出した場合も、CSVのフラグ列に「要確認」を追記する。これでHookが一括で検出できる。
HookがCSVのフラグを検出する
②③が終わったら、Hookが動く。
Hookは settings.json(Claude Codeの設定ファイル)に設定する。PostToolBatch イベントを使う。これは「Claude Codeがツールバッチを実行し終わったあと」に自動で動く仕組みだ。ここでCSVをチェックするようにしておけば、SubAgentの処理が終わったタイミングで自動的に動く。
{
"hooks": {
"PostToolBatch": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "python3 check_expense_flags.py"
}
]
}
]
}
}
HookはCSVを開いて「要確認」フラグを検索する。
import sys
import os
csv_path = "expense_report.csv"
if not os.path.exists(csv_path):
sys.exit(0) # CSVがまだ存在しない → 何もせず通過
with open(csv_path, encoding="utf-8") as f:
content = f.read()
if "要確認" in content:
print("要確認の行があります。expense_report.csv を確認してください。",
file=sys.stderr)
sys.exit(2)
sys.exit(2) を返すと、Claude Codeはその先の処理を止めて人間に確認を求める。
このスクリプトはプロジェクトルートで実行される前提なので、"expense_report.csv" はファイル名だけで参照できる。
「要確認がある → 止める → 人間が確認 → 問題なければ再実行」
このループが、ミスを自動で防ぐ仕組みだ。
PostToolBatch はツールを使うたびに毎回動く。でも expense_report.csv がなければ通過し、「要確認」がなければ通過する。実際に止まるのは「CSVがあって、かつ要確認フラグがある」ときだけだ。
MCPでSlackに通知する
すべて問題なければ、MCP経由でSlackに通知する。
expense_report.csv を生成しました。
合計:85,446円
- 交通費 4,657円
- 宿泊費 56,160円
- 交際費 21,060円
- その他 3,569円
要確認フラグ:なし
このメッセージが #経費精算 チャンネルに届く。
Skillの中で「MCPのSlackツールを使って、#経費精算チャンネルに通知して」と指示しておけば、自動で送信される。
Slack MCPの追加は、中級第5弾で扱ったMCP追加の手順と同じだ。
通知先チャンネルはCLAUDE.mdに書いてあるので、毎回設定を聞かれない。
実際に動かしてみる
準備が整ったら、article-16/ フォルダで Claude Code を起動して /expense-check と打つだけだ。
> /expense-check
Claude Codeはまず receipts/ フォルダの中身を確認し、6枚の領収書を並列で読み取り始める。
6つのSubAgentが同時に走る。順番に処理するより、時間が大幅に短くなる。

読み取りが完了すると、expense_report.csv が生成される。
● Write(expense_report.csv)
続いて、費目チェックと必須項目確認が同時に走る。
● Task(費目・金額の妥当性チェック中)
● Task(必須項目の漏れ確認中)
ここでHookが動く。PostToolBatch イベントが発火し、check_expense_flags.py が自動で実行される。
要確認フラグがある場合は、処理がここで止まる。
Hook: 要確認の行があります。expense_report.csv を確認してください。

該当行だけ目視確認して、問題なければ /expense-check を再実行する。
フラグがなければそのまま進み、Slackに完了通知が届く。

一行打っただけで、読み取り・チェック・通知まで全部終わった。
7. 初級との差分
| 初級第4弾 | 中級第6弾 |
|---|---|
| 6枚を1枚ずつ順番に処理 | SubAgentで6枚を同時に処理 |
| 毎回「読んで」「チェックして」と指示 | /expense-check の一行で起動 |
| エラーは全部自分で確認 | Hookが「要確認」フラグの行だけ通知 |
| 完了は自分で確認 | Slack MCPで自動通知 |
| 毎回同じ条件を説明する | CLAUDE.mdに書いてあるので不要 |
初級は「できる」を体験する段階だった。
中級は「繰り返せる仕組みにする」段階だ。
8. 最小構成から始める
今回のフロー全体を一気に作る必要はない。
おすすめの順番はこれだ。
| ステップ | 内容 | 効果 |
|---|---|---|
| 1 | CLAUDE.mdに申請者情報・費目分類を書く | 毎回の説明が不要になる |
| 2 | 経費精算フローをSkillとして定義する | 一行で起動できる |
| 3 | SubAgent①で読み取りを並列化する | 処理が速くなる |
| 4 | SubAgent②③でチェックを追加する | ミスを事前に防げる |
| 5 | Hookで要確認フラグを検出する | 問題行だけ通知される |
| 6 | MCP(Slack)で完了通知を送る | 確認の手間がなくなる |
1と2だけでも、初級より大幅に楽になる。
3以降は、使いながら足せばいい。
仕組みは小さく始めて、育てていく。

9. よくある失敗
失敗1:SubAgentを全部並列にしようとする
CSVができる前にチェックはできない。依存がある作業は順番に。
失敗2:HookにClaudeの判断をさせようとする
Hookにできるのはフラグの有無の検出だけ。判断はClaudeがやる。
失敗3:全部自動にしようとする
人間が確認すべきものを、全部自動で処理しようとすると危険だ。
「要確認フラグがあれば止める」は正しい。
「要確認フラグを自動で消して先に進む」は間違い。
Hookは人間の確認を飛ばすためのものではなく、人間が確認すべき箇所に確実に気づかせるためのものだ。
今日から試せる一歩
CLAUDE.mdを開いて、申請者情報と費目分類ルールを追加する。
次に経費精算の話をするとき、Claude Codeは「いつものフォーマットで」を理解して動いてくれる。
それだけでいい。
SubAgentもHookもMCPも、あとで足せる。
まず「毎回同じ説明をしなくていい」状態を作ることから始める。
仕組みは、一気に作るものではない。使いながら育てるものだ。
中級編は、ここで完結する。
6つ全部をつないで、AIが仕組みとして回る状態を作る。
それが中級編のゴールだった。
次は上級編だ。
SubAgent・Plugin・チーム共有・他AIとの役割分担。
でもその前に、まず自分の仕事で1つだけフローを作ってみてほしい。
経費精算でも、週報でも、議事録でもいい。
一度うまくいった仕事が、次も同じ品質で動く。
その状態が、Claude Code中級編のゴールだ。