CLAUDE LABEN
2.1.273 — 接続まわりがまとめて整理されました。LLM ゲートウェイ向けの 5 ヘッダが opt-in で追加され、MCP が再接続を諦めたときにも通知が出ます09/29 — 廃止予定表にある claude-sonnet-4-5 の日付は残り 12 日ですが、これは「最も早い場合」の暫定日です。現在も Active で、公開モデルの廃止は最低 60 日前に告知されますMCP — セッションを畳まずに繋ぎ直したい、という要望が続いています。切断の通知は出るようになりましたが、再接続そのものはまだ手元の操作に委ねられていますNEW — 定期タスクが動く日と動かない日があったのは、フォルダを1つしか指定していなかったからでしたWINDOWS — Cowork が最初のタスクから失敗するときは、原因を探す前に開発者モードとセットアップの状態を確認しますHANDOFF — 会話が重くなった原稿を次のチャットへ渡すとき、要約に必ず残しておく項目を先に 3 つ決めておきます2.1.273 — 接続まわりがまとめて整理されました。LLM ゲートウェイ向けの 5 ヘッダが opt-in で追加され、MCP が再接続を諦めたときにも通知が出ます09/29 — 廃止予定表にある claude-sonnet-4-5 の日付は残り 12 日ですが、これは「最も早い場合」の暫定日です。現在も Active で、公開モデルの廃止は最低 60 日前に告知されますMCP — セッションを畳まずに繋ぎ直したい、という要望が続いています。切断の通知は出るようになりましたが、再接続そのものはまだ手元の操作に委ねられていますNEW — 定期タスクが動く日と動かない日があったのは、フォルダを1つしか指定していなかったからでしたWINDOWS — Cowork が最初のタスクから失敗するときは、原因を探す前に開発者モードとセットアップの状態を確認しますHANDOFF — 会話が重くなった原稿を次のチャットへ渡すとき、要約に必ず残しておく項目を先に 3 つ決めておきます
記事一覧/Claude Code
Claude Code/2026-08-20上級

起動しただけで1万トークン消えるスキルを、大きさではなく到達率で切り分ける

自分用の運用スキルが、呼び出しただけで約1万トークンを消費していました。節ごとにトークンを測り、最大の節ほど切り出してはいけない理由と、到達率で分けたときの実測値を、監査スクリプトつきでまとめます。

Claude Code254SKILL.md7progressive disclosure2文脈設計3個人開発127

プレミアム記事

壁紙アプリの素材を仕分ける自分用のスキルを呼び出したとき、まだ画像を1枚も見ていないのに、最初の返答までの間が以前より長く感じられました。仕分けの手順そのものは変えていません。増やしたのは、混入が多いカテゴリの判定ルールと、マージ後の API 反映手順だけです。

そのスキルを測ってみたら、SKILL.md 1本で約1万トークンありました。仕分けを始める前、つまり画像の話を1つもしていない時点で、それが文脈に載っていたことになります。

8月17日の Claude Code v2.1.234 で、組み込みの claude-api スキルを読み込むときの文脈コストが約20万トークン超から約2.5万トークンへ下がりました。参照ドキュメントを、必要になった時点で読み込む方式へ変えたためです。同じことを自分のスキルでもやるべきだと考えたところまでは、たぶん多くの方と同じだと思います。

問題は、どの節を外に出すかでした。私は最初、一番大きい節から順に出そうとして、間違えました。

呼び出した時点で、まだ何もしていない

Claude Code のスキルは、description だけが常時読み込まれ、SKILL.md の本体は呼び出されたときに読み込まれます。つまり本体のサイズは「常時コスト」ではなく「起動コスト」です。ここを取り違えると、「使っていないスキルを減らせば軽くなる」という方向に対策が向かってしまいます。実際に効くのは、呼び出したときに載る量のほうです。

個人開発で複数のアプリとサイトを並行して回していると、スキルは自然に長くなります。私の場合、壁紙のカテゴリ分類スキルは30カテゴリぶんの判定ルールを抱えていて、そこに「混入が多いカテゴリの厳格ルール」が後から積み上がりました。書いた本人としては、どれも必要だから書いています。だからこそ、感覚で削る判断ができません。

そこで、節ごとの数値を出すところから始めました。

節ごとに測る、小さな監査スクリプト

やることは単純です。SKILL.md を H2 / H3 で分解し、節ごとにトークン数を数え、大きい順に並べます。それだけで、どこに文脈が消えているかは一目で分かります。

Claude のトークナイザは公開されていないため、ここでは tiktokencl100k_base を使っています。絶対値としては正確ではありません。節と節の比率を見るための物差しとして使う、という位置づけです。tiktoken が入っていない環境でも動くように、文字種別の概算にフォールバックさせています。

#!/usr/bin/env python3
"""SKILL.md の文脈コストを節単位で測り、切り出し候補を出す。
 
使い方:
    python3 skill_context_audit.py path/to/SKILL.md
    python3 skill_context_audit.py path/to/SKILL.md --split out_dir
 
節の見出し直後に reach 注釈(HTML コメント)を書いておくと、
到達率別の集計と切り出しを行う。注釈がない節は always 扱い。
"""
import argparse, os, re, sys
 
try:
    import tiktoken
    _ENC = tiktoken.get_encoding("cl100k_base")
    def count_tokens(text: str) -> int:
        return len(_ENC.encode(text))
    TOKENIZER = "cl100k_base"
except ImportError:
    # tiktoken が無い環境向けの概算。日本語1文字≒0.7token、ASCII 4文字≒1token
    def count_tokens(text: str) -> int:
        cjk = sum(1 for c in text if ord(c) > 0x2E80)
        return int(cjk * 0.7 + (len(text) - cjk) / 4)
    TOKENIZER = "approx"
 
REACH_RE = re.compile(r"<!--\s*reach:\s*([a-z0-9_]+)\s*-->")
HEADING_RE = re.compile(r"(?m)^(#{2,3} .*)$")
 
 
def split_sections(md: str):
    """(見出し, 見出し込みブロック) の列に分解する。先頭は __head__。"""
    parts = HEADING_RE.split(md)
    sections = [("__head__", parts[0])]
    for i in range(1, len(parts), 2):
        body = parts[i + 1] if i + 1 < len(parts) else ""
        sections.append((parts[i].strip(), parts[i] + "\n" + body))
    return sections
 
 
def reach_of(block: str) -> str:
    m = REACH_RE.search(block)
    return m.group(1) if m else "always"
 
 
def audit(path: str):
    md = open(path, encoding="utf-8").read()
    sections = split_sections(md)
    rows = [(h, reach_of(b), count_tokens(b)) for h, b in sections]
    total = sum(r[2] for r in rows)
 
    print(f"file      : {path}")
    print(f"tokenizer : {TOKENIZER}")
    print(f"total     : {total} tok / {len(md)} chars\n")
    print(f"{'tok':>7} {'share':>6}  reach     heading")
    for h, reach, t in sorted(rows, key=lambda r: -r[2]):
        print(f"{t:7d} {t * 100 / total:5.1f}%  {reach:<9} {h[:56]}")
 
    by_reach = {}
    for _, reach, t in rows:
        by_reach[reach] = by_reach.get(reach, 0) + t
    print("\n-- 到達率別 --")
    for reach, t in sorted(by_reach.items(), key=lambda kv: -kv[1]):
        print(f"  {reach:<10} {t:6d} tok ({t * 100 / total:4.1f}%)")
 
    resident = by_reach.get("always", 0)
    print(f"\n常駐(always)だけを本体に残した場合の起動時コスト: {resident} tok"
          f"({(1 - resident / total) * 100:.1f}% 削減)")
    return rows, total

出力はこうなります。実際に運用している壁紙のカテゴリ分類スキルに通した結果です。

file      : .claude/skills/wallpaper-category/SKILL.md
tokenizer : cl100k_base
total     : 10048 tok / 14372 chars
 
    tok  share  reach     heading
    980   9.8%  always    ### 1. バッチ処理(レートリミット対策付き)
    849   8.4%  always    ### 自動マージ(100枚ごと)
    755   7.5%  always    __head__
    596   5.9%  always    ## カテゴリの相互排他ルール(重複禁止の組み合わせ)
    586   5.8%  always    ### 3. APIカテゴリへの自動適用(マージ後に必ず実行)
    481   4.8%  always    ### ⚠️ 3D — 厳格ルール(混入多発カテゴリ)
    458   4.6%  always    ### ⚠️ タイポグラフィ — 厳格ルール(重複・混入多発カテゴリ)

14,372 文字で約 10,048 トークンです。日本語主体の文書なので、文字数から受ける印象よりトークンは重くなります。1文字あたり 0.7 トークン前後という比率は、日本語で SKILL.md を書いている方なら覚えておいて損はありません。行数で管理していると、この重さは見えません。

行数を基準にした管理については、以前 SKILL.md の後半が読まれていなかった話 でも書きました。今回はその続きにあたります。行数で上限を決めたあと、では具体的にどの節を外へ出すのか、という段です。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
自分のスキルのどの節が起動時の文脈を食べているのかを、節単位の数値で把握できるようになります
大きい節を references に出して読み込みの往復を増やす失敗を、切り出す前に避けられるようになります
複数のセッションにまたがる作業手順について、どこでスキルを分けるべきかの基準を持てるようになります
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥2,480 の永久アクセス
メンバーシップを見る →

関連記事

Claude Code2026-09-10
plugin.json を1枚置くと、スキルの棚がまとめて外せる単位になります
スキルを用途ごとに色分けしたら、毎日使う一群は全体の5パーセントしかありませんでした。.claude-plugin/plugin.json を1枚置いてフォルダをプラグインに変え、その日に使わない棚をグループごと外せるようにするまでの手順と、途中で二度つまずいた読み込みの規則を書き残します。
Claude Code2026-09-06
スキルを数えたら42本ありました。うち4本は中身が『移動しました』だけでした
Claude Code v2.1.261 で入った /skill-doctor を入り口に、自分のスキル棚を実際に数えてみました。毎ターン乗るのは説明の1行だけという構造と、名前の重複を素朴な awk で探すと別のスキルまで拾ってしまう落とし穴を、手元で動かした小さなスクリプトとともに書き残します。
Claude Code2026-05-30
SKILL.md の後半が読まれていなかった話 — 200行に収める設計と progressive disclosure
Codex CLI が SKILL.md を約220行で読み止める観測をきっかけに、エージェントが実際に読む長さと、SKILL.md を200行以内に収める設計・references への退避の考え方を整理しました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます