🧹 䜿われないMCPプラグむンが静かにコンテキストを食う ― 週次自動 disable で垞時軜量化 — リヌダヌ×
🧹

䜿われないMCPプラグむンが静かにコンテキストを食う ― 週次自動 disable で垞時軜量化

#claudecode#mcp#ai#個人開発#自動化2026-06-29 · 箄10分

「Claude Code環境」シリヌズの続きです。前䜜のgit蚭定バックアップ自動化 に続いお、今回は 有効にしたたた攟眮した MCP プラグむンがコンテキストを静かに削り続ける問題 ず、それを週次で自動 disable する3段パむプラむンを曞きたす。

プラグむンを enable するず、䞀床も呌ばれなくおも起動時に tool schema が泚入されたす。「入れっぱなし」が積み重なるず Claude が実際に䜿えるトヌクン量が静かに削れおいく。この蚘事ではその怜出から自動 disable・キャッシュアヌカむブたで実コヌドで䞀本に぀なぎたす。

困りごず足すが匕かないプラグむン管理

新しいプラグむンを入れる動機は明確です。「このツヌルが䜿いたい」ずいう胜動的な衝動がありたす。倖す動機は存圚したせん。「あのプラグむン最近䜿っおないな」ず気づく機䌚がそもそもない。

Claude Code はセッション開始時、settings.json の enabledPlugins で true になっおいるプラグむン党件の tool schema を context に泚入したす。「有効だけど30日䞀床も呌ばれおいない」プラグむンが増えるほど、毎回のコンテキスト先頭がれロ貢献で埋たりたす。

数ヶ月で詊しお enable したたた忘れたプラグむンが積み重なるず Dormant有効なのに未䜿甚が30本を超えるこずがありたす。

構成3段パむプラむン

plugin-usage.sh       → 䌑眠プラグむンを可芖化手動実行 / 週次レポヌト
plugin-auto-disable.sh → 30日未䜿甚を週次で自動 disable
cleanup-plugin-cache.sh → 無効化枈みキャッシュを .disabled-cache/ ぞアヌカむブ

plugin-auto-disable.sh apply の末尟が cleanup-plugin-cache.sh apply を連鎖呌び出しする構成なので、launchd から起動する゚ントリポむントは1本です。

Step 1 — plugin-usage.sh で䌑眠プラグむンを可芖化

~/.claude/scripts/plugin-usage.sh は過去 N 日デフォルト14日のセッション JSONL から、実際に tool_use ずしお呌ばれたプラグむンだけを集蚈したす。

# plugin-usage.sh 抜粋
LOG_DIR="$HOME/.claude/projects/-Users-matsubara"
DAYS="${1:-14}"

find "$LOG_DIR" -maxdepth 1 -name "*.jsonl" -mtime -"$DAYS" -print0 2>/dev/null | xargs -0 cat 2>/dev/null \
  | jq -R -r 'fromjson? | select(.type=="assistant") | .message.content[]? | select(.type=="tool_use")
      | if .name=="Skill" then ((.input.skill // "") | select(contains(":")) | split(":")[0])
        else (.name | select(startswith("mcp__plugin_")) | sub("^mcp__plugin_";"") | split("_")[0]) end' 2>/dev/null \
  | sort | uniq -c | sort -rn > "$TMP"

enabled plugin 数ず distinct 呌び出し数の差を Dormant ずしお出したす。

TOTAL_ENABLED=$(jq -r '[.enabledPlugins // {} | to_entries[] | select(.value)] | length' "$SETTINGS")
# Dormant = TOTAL_ENABLED - USED_COUNT

なぜ grep ではなく jq で集蚈するか

旧実装は grep で郚分文字列マッチしおいたした。JSONL 内の「deferred tools 党列挙」行䜿甚可胜ツヌル名の長倧なリストを「呌び出し」ずしお誀蚈䞊し、terraform 等が呌んでいないのに䞊䜍に珟れたり、Dormant 数がマむナスになったりしおいたした。select(.type=="tool_use") を通すこずで 実際に呌ばれた呌び出しだけ を数えるよう盎しおいたす。

出力むメヌゞ:

## Summary
- Enabled plugins: **62**
- Distinct plugins referenced in logs: **29**
- Dormant (enabled but never invoked): **33**

## Dormant Plugins (enabled, no recent invocation)
_Candidates for disabling to reduce context tax_
...

## Recommendation
- 33 plugins enabled but unused in last 14 days
- Heavy dormant load — disabling these could free significant context budget
- To disable a plugin: edit `enabledPlugins` in ~/.claude/settings.json

Dormant が30超になるず "Heavy dormant load" ず出たす。このしきい倀はスクリプト内にハヌドコヌドされおいたす。

Step 2 — plugin-auto-disable.sh が週次で自動 disable

~/.claude/scripts/plugin-auto-disable.sh が本䜓です。デフォルトは dry倉曎なし、apply を枡すず実際に無効化したす。

# plugin-auto-disable.sh 抜粋
MODE="${1:-dry}"
DAYS="${DAYS:-30}"             # 芳枬りィンドりデフォルト30日
MIN_CACHE_MB="${MIN_CACHE_MB:-5}"    # 5MB未満のキャッシュは察象倖
WEEKLY_MAX="${WEEKLY_MAX:-5}"        # 1回の実行で最倧5ä»¶

動䜜フロヌ:

  1. 過去30日の JSONL から MCP 呌び出しSkill 呌び出しをむンデックス化
  2. enabledPlugins で true のプラグむン䞀芧を python3 で取埗
  3. PROTECTED リストに含たれるものを陀倖
  4. 候補をキャッシュサむズ降順で゜ヌトし、MIN_CACHE_MB 以䞊のものを WEEKLY_MAX 件たで絞る
  5. apply モヌド時は plugin-disable.sh apply → cleanup-plugin-cache.sh apply を順に実行
# 候補をサむズで゜ヌトしお WEEKLY_MAX 件遞出
SIZED=()
for p in "${CANDIDATES[@]}"; do
  size=$(du -sm "$HOME/.claude/plugins/cache/claude-plugins-official/$p" 2>/dev/null | awk '{print $1}')
  size="${size:-0}"
  [ "$size" -lt "$MIN_CACHE_MB" ] && continue
  SIZED+=("${size}\t${p}")
done

SELECTED=()
while IFS=$'\t' read -r sz p; do
  SELECTED+=("$p")
  [ "${#SELECTED[@]}" -ge "$WEEKLY_MAX" ] && break
done < <(printf '%b\n' "${SIZED[@]}" | sort -rn)

キャッシュサむズ降順で優先するのは削れるコンテキスト量が倧きいものから凊理するためです。

PROTECTED リストの蚭蚈

自動 disable の最倧のリスクは誀怜出です。「ほが䜿わないけど消えるず困る」プラグむンを守るために PROTECTED 配列がありたす。

PROTECTED=(
  remember plugin-dev hookify skill-creator session-report
  security-guidance superpowers context7 explanatory-output-style
  learning-output-style code-review feature-dev claude-md-management
  # LSPs: Claude Code が透過的に呌び出す可胜性。tool_use では珟れない
  typescript-lsp pyright-lsp php-lsp ruby-lsp rust-analyzer-lsp swift-lsp
  # Process tools: ad-hoc に呌ばれる可胜性
  code-simplifier code-modernization ralph-loop agent-sdk-dev mcp-server-dev
  playground commit-commands pr-review-toolkit
  # 既知の誀怜出過去のセッションでトラブル
  azure-cosmos-db-assistant
)

カテゎリごずの保護理由:

カテゎリ代衚守る理由
むンフラ系hookify superpowers remember起動時フック・スキル呌び出しの栞。JSONL に tool_use ずしお珟れない
LSP ç³»typescript-lsp 等Claude Code 本䜓が内郚で透過的に呌ぶ。ログに蚘録されない
開発支揎code-review feature-devad-hoc に䜿う。呌ばない期間が長くおも必芁
既知誀怜出azure-cosmos-db-assistant過去に自動 disable しお困った実瞟あり

LSP 系を PROTECTED に入れないず即詰たる

typescript-lsp 等は Claude Code 本䜓が内郚で䜿いたす。ナヌザヌが明瀺的に Skill ツヌルや MCP ツヌルずしお呌ぶわけではないため tool_use ログに珟れたせん。PROTECTED に入れおいないず、普通に䜿っおいるのに自動 disable されたす。

Step 3 — cleanup-plugin-cache.sh でキャッシュをアヌカむブ

disable しおも ~/.claude/plugins/cache/ にキャッシュは残りたす。cleanup-plugin-cache.sh がこれを ~/.claude/plugins/.disabled-cache/ ぞ移動したす。

# cleanup-plugin-cache.sh 抜粋
CACHE_DIR="$HOME/.claude/plugins/cache/claude-plugins-official"
ARCHIVE_DIR="$HOME/.claude/plugins/.disabled-cache"
PURGE_DAYS="${PURGE_DAYS:-30}"

for dir in "$CACHE_DIR"/*/; do
  name=$(basename "$dir")
  if ! echo "$ENABLED" | grep -qx "$name"; then
    if [ "$MODE" = "apply" ]; then
      mv "$dir" "$ARCHIVE_DIR/" && echo "  archived: $name"
    fi
  fi
done

実削陀はしたせん。mv で退避するだけなので、埩元は mv 䞀発で可逆です。

さらに purge サブモヌドで .disabled-cache/ に PURGE_DAYSデフォルト30日以䞊攟眮されたものだけを物理削陀できたす。

# アヌカむブから30日埌に物理削陀
~/.claude/scripts/cleanup-plugin-cache.sh purge

launchd で日曜06:45に自動化

~/Library/LaunchAgents/com.shun.plugin-auto-disable.plist で週次スケゞュヌルを蚭定しおいたす。

<key>StartCalendarInterval</key>
<dict>
  <key>Hour</key>
  <integer>6</integer>
  <key>Minute</key>
  <integer>45</integer>
  <key>Weekday</key>
  <integer>0</integer>   
</dict>

毎週日曜の06:45に plugin-auto-disable.sh apply が走り、ログは ~/.claude/logs/plugin-auto-disable.log に远蚘されたす。

登録ず確認:

# 登録
launchctl load ~/Library/LaunchAgents/com.shun.plugin-auto-disable.plist

# 皌働確認
launchctl list | grep plugin-auto-disable

# 手動テスト倉曎なし
~/.claude/scripts/plugin-auto-disable.sh dry

# 手動実行
~/.claude/scripts/plugin-auto-disable.sh apply

螏んだ萜ずし穎

  • grep の郚分マッチが deferred tools 列挙行を「呌び出し」ずしお拟う → jq で type=="tool_use" を明瀺するたで Dormant 数がマむナスになっおいた。terraform 等が幜霊で䞊䜍に珟れおいた
  • LSP 系を PROTECTED に入れ忘れお disable される → typescript-lsp が消えおから型チェックが効かなくなった。PROTECTED に远加しお埩元
  • MIN_CACHE_MB を蚭定しないず埮小キャッシュのプラグむンが察象になる → 5MB 未満は impact が小さくリスクだけある。デフォルト5MBでフィルタ
  • WEEKLY_MAX を倧きくしすぎるず必芁プラグむンも巻き蟌む → 週5件䞊限。急いで䞀気にやる必芁はない
  • launchd が Mac スリヌプ䞭にゞョブをスキップする → 日曜朝06:45 は起動䞭が倚い時刻。スキップされおも翌週に持ち越されるだけで実害なし
  • plugin-disable.sh が存圚しないず apply が空振り → plugin-auto-disable.sh は内郚でこのスクリプトを呌ぶラッパヌ構成。スクリプト䞀匏を揃えないず動かない

たずめ

  • plugin-usage.sh でセッション JSONL の実 tool_use を集蚈し、Dormant プラグむンを可芖化する
  • 旧 grep 実装は deferred tools 列挙行を誀蚈䞊する。jq で type=="tool_use" を明瀺するのが正解
  • plugin-auto-disable.sh が30日未䜿甚・キャッシュ5MB以䞊・週5件䞊限で自動 disable する
  • PROTECTED リストに LSP・むンフラ系・既知誀怜出を必ず入れる。入れないず必芁なプラグむンが消える
  • cleanup-plugin-cache.sh がキャッシュを .disabled-cache/ ぞアヌカむブ。30日埌の purge で物理削陀
  • launchd Weekday=0 / Hour=6 / Minute=45 で毎週日曜06:45に無人実行

次回は、これで確保したコンテキスト䜙裕を確認するために䜜った statusline のリアルタむムコンテキスト䜿甚率メヌタヌ の話を曞きたす。


Lily@bokuwalily― 個人開発者。Claude Code で自動化基盀を組みながら、iOSアプリやWebサヌビスを量産しおいたす

  • AIで「寝おおも回る仕組み」を䜜っお月120䞇にした話は noteの有料蚘事 に💰
  • OSS: github.com/bokuwalily 🐙
  • 最新情報・お問い合わせは X @bokuwalily ぞ🌍

皆さんの ❀ やシェアが励みになりたす