◉CLAUDE LABEN
●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました
記事一覧/Cowork
◈ Cowork/2026-07-17上級

手元では動くのに、配ると呼び出されない — Cowork プラグインから剥がした4つの前提

自分の環境で動いていたスキル4本をプラグインにまとめて渡したところ、発火したのは1本だけでした。発火率の測り方と、配布前に剥がすべき環境依存・description・権限・命名衝突の4前提を実装込みで整理します。

cowork16plugin3skillmcp20automation55distribution

✦ プレミアム記事

個人開発の合間に少しずつ書き足してきた自動化スキルが、半年で4本たまっていました。どれも自分の手元では気持ちよく動きます。せっかくなのでプラグインにまとめ、同じような作業をしている知人に渡してみました。

数日後の返事は短いものでした。「入れてみたけど、何も起きないです」。

こちらでは動いている。向こうでは動かない。よくある話ではありますが、原因を1つずつ剥がしていくうちに、自分が何を暗黙の前提にしていたのかがはっきり見えてきました。この記事は、そのときの記録です。

まず「動かない」の中身を分解する

「動かない」には少なくとも3つの段階があります。

段階症状切り分けの合図
発火しないスキルが呼ばれず、Claude が素の応答を返すツール呼び出しのログに Skill が出てこない
発火するが落ちる呼ばれた直後にエラーで停止するパス・トークン・権限のエラーメッセージが出る
完走するが結果が違う最後まで走るが出力が期待と食い違うログはすべて成功、成果物だけがおかしい

知人の環境で起きていたのは、いちばん上の「発火しない」でした。ここを飛ばして中身のデバッグに入ると、延々と見当違いの場所を掘ることになります。

私は最初、それをやりました。コネクタの設定を疑い、権限を疑い、1時間ほど溶かしています。個人開発では自分がテスターも兼ねるので、疑う順番を間違えると誰も止めてくれません。実際にはスキルが一度も呼ばれていなかったので、中身がどうであれ関係がなかったのです。

発火率を数字にする

感覚で議論しても進みません。「たぶん description が悪い」では、直したかどうかも分かりません。

そこで、想定される発話を並べて、どのスキルが選ばれるかを記録する小さな検証を組みました。ヘッドレスの claude -p を回して、ツール呼び出しから Skill の名前だけを抜き出します。

まず、テストケースを1行1件の JSONL で用意します。

{"utterance": "先週の売上をまとめてレポートにして", "expect": "weekly-report"}
{"utterance": "週次レポート作って", "expect": "weekly-report"}
{"utterance": "今週のサマリーをください", "expect": "weekly-report"}
{"utterance": "溜まってる Issue を仕分けして", "expect": "issue-triage"}
{"utterance": "新しく来た issue にラベル付けといて", "expect": "issue-triage"}
{"utterance": "リリースノートの下書きを用意して", "expect": "release-notes"}
{"utterance": "今日の分の請求をチェックして", "expect": "billing-check"}

expect は「この発話ならこのスキルが選ばれてほしい」という期待値です。自分の口癖だけでなく、同じ意図を別の言い回しで表現したものを必ず混ぜます。ここが後で効いてきます。

続いて、それを流すスクリプトです。

#!/usr/bin/env bash
# skill-trigger-check.sh — 想定発話に対してどのスキルが選ばれるかを記録する
# usage: ./skill-trigger-check.sh cases.jsonl trigger-report.tsv
set -euo pipefail
 
CASES="${1:?usage: skill-trigger-check.sh <cases.jsonl> [out.tsv]}"
OUT="${2:-trigger-report.tsv}"
 
: > "$OUT"
 
while IFS= read -r line; do
  [ -z "$line" ] && continue
  utterance=$(jq -r '.utterance' <<<"$line")
  expected=$(jq -r '.expect'     <<<"$line")
 
  # 1ターンだけ回し、Skill ツールの呼び出し先を取り出す。
  # 実際の副作用を出さないため --max-turns 1 で止める。
  actual=$(claude -p "$utterance" \
             --output-format stream-json --verbose --max-turns 1 2>/dev/null \
           | jq -rs '[ .[]
                       | select(.type == "assistant")
                       | .message.content[]?
                       | select(.type == "tool_use" and .name == "Skill")
                       | .input.skill ] | first // "none"')
 
  if [ "$actual" = "$expected" ]; then status="MATCH"; else status="MISS"; fi
  printf '%s\t%s\t%s\t%s\n' "$status" "$expected" "$actual" "$utterance" >> "$OUT"
done < "$CASES"
 
awk -F'\t' '
  { n++; if ($1 == "MATCH") m++ }
  END { printf "発火率: %d/%d (%.0f%%)\n", m, n, (n ? m*100/n : 0) }
' "$OUT"

--max-turns 1 を付けているのは、検証のたびに本物の Issue にラベルが付いたら困るからです。知りたいのは「呼ばれるかどうか」だけなので、呼ばれた瞬間に止めます。jq -rs でストリームを配列にまとめてから最初の Skill 呼び出しを拾い、1件も無ければ none を返す形にしました。

自分の環境で走らせると、20件中18件が MATCH。90% です。手元で快適だったのは当然でした。

知人の環境で同じケースを流してもらった結果が、20件中5件。25% です。4本のスキルのうち、実質的に反応していたのは1本だけでした。

数字が出た瞬間、議論が具体になりました。MISS になった15件を眺めれば、何が起きているかは目に見えます。

✦

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

この記事の続きを読む

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

この記事で得られること
✦claude -p のヘッドレス実行で「どのスキルが選ばれたか」を記録し、発火率を測る検証スクリプト(20ケースで 25% → 85% の推移を追跡)
✦SKILL.md の description を「説明文」から「ルーティングの入力」に書き換える3つの規則と Before/After
✦絶対パス・素の資格情報・未文書の環境変数・命名衝突を配布前に洗い出す preflight スクリプト(bash・そのまま CI に置ける形)
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

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

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

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

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

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

関連記事

◈ Cowork2026-08-23
コネクタが使えない朝に、待つのか人に返すのかを分ける三つの状態
無人実行でコネクタに届かないとき、原因は起動途中・未認証・恒久欠落の三つに分かれます。それぞれ正しい対処が正反対になる理由と、待機予算を切り分ける判定器の実装をまとめました。
◈ Cowork2026-05-04
Cowork スケジュールタスクが黙って止まる理由と、自動で立ち直る仕組みの作り方
Coworkのスケジュールタスクが黙って止まる原因を、実測した終了コードとエラー文で切り分けます。safe.directory が失敗を遅らせる仕組み、書ける場所を先に決めるプリフライト、理由コード付きログまで扱います。
◈ Cowork2026-10-08
毎回読ませる指示ファイルを半分にした夜、削る前に3つの引き出しへ分けました
指示ファイルが長くなるほど、書いたはずの決まりごとが守られなくなります。毎回読ませる分を半分にするため、残す・移す・捨てるの3つに分けた基準と、見出しごとの大きさを測る小さなスクリプトをまとめます。