ð§¹ è²ãŠãããç°å¢ã¯è ãââ鱿¬¡ env-audit ã§ Claude Code ãæ£åžããã
æå0åããå幎ã§120äžãŸã§æã£ãŠããå¯äžã®çç±ã¯ãç°å¢ããè²ãŠããã®ã§ã¯ãªããè ãããªããä»çµã¿ãå ã«äœã£ãããšã§ãã
ãªããã®ä»çµã¿ãå¹ãã®ã
Claude Code ã䜿ã蟌ãã»ã©ããã¡ã€ã«ã¯å¢ããŸãã詊ãã«å ¥ãã MCP ãµãŒããŒãã䟿å©ããããšæã£ãŠè¿œå ãããã©ã°ã€ã³ãå¢ãã§æžãã auto-skillââã©ãã远å ããç¬éã¯ç®çããããŸããåé¡ã¯ãã®åŸã§ãã
MCP ãµãŒããŒã¯èªèšŒããŒã¯ã³ã倱å¹ããŠããŠã Failed to connect ã®ãŸãŸèšå®ã«å±
座ãç¶ããŸãããã©ã°ã€ã³ã¯ã³ãã³ããã¡ã€ã«ããã£ã¹ã¯äžã«æ®ã£ãŠããŠã settings.json ã® enabledPlugins ããæ¶ããŠããã°åããªããŸãŸå®¹éã䜿ããŸããauto-skill ã¯ããšããããæžãããæé ãå幎åŸã ~/.claude/skills/auto/ ã«é®åº§ããClaude ãæ¯åãããèªã¿èŸŒãããšããã³ã³ããã¹ãçšãæãç¶ããŸãã
ããã¯ã䜿ã£ãŠããªãã¢ããªãå¢ããŠã iPhone ã¯é
ããªããªãããšãã話ãšã¯å
šãéããŸããClaude Code ã®ã³ã³ããã¹ããŠã£ã³ããŠã¯æéã§ãèµ·åæã«èªã¿èŸŒãŸããèšå®ã»ã¹ãã«ã»ããã¯äžèЧã®ç·éãçŽæ¥ãæåã®è¿çå質ãã«åœ±é¿ããŸãã50 åã®ãã©ã°ã€ã³ãæå¹ã«ãªã£ãŠããã°ããã®ã¡ã¿ããŒã¿ã¯æ¯åã³ã³ããã¹ãã«ä¹ããŸãã10 åã® MCP ãµãŒããŒã Failed ã®ãŸãŸæ®ã£ãŠããã°ãæ¥ç¶è©Šè¡ã®ã¿ã€ã ã¢ãŠããèµ·åãé
å»¶ãããŸãã
ç§ãããã身ããã£ãŠäœéšããã®ã¯ãClaude Code ãæ¬æ Œå°å
¥ã㊠3 ã¶æç®ã®ããšã§ããæåã䌞ã³ãã«ã€ããŠããã£ãšäŸ¿å©ã«ããš MCP ã远å ãç¶ããçµæãããé±ãã Claude ã®ååã¬ã¹ãã³ã¹ãæããã«éããªããŸããã調ã¹ãŠã¿ããšãclaude mcp list ã®åºåã« Failed to connect ã 7 件䞊ãã§ããŸããããã®ãã¡ 5 ä»¶ã¯å
¥ããèšæ¶ãããªãââãã©ã°ã€ã³çµç±ã§èªå远å ããããã®ã§ããã
ãå£ããŠããããšã«æ°ã¥ããªãããšããç¶æ ãäžçªã³ã¹ããé«ãã®ã§ããå£ãããŸãŸ 3 é±é䜿ãç¶ããæ¥ç¶è©Šè¡ã®ã¿ã€ã ã¢ãŠãã¯ã环ç©ã§äœååãã®åŸ ã¡æéã«ãªããŸããæ°ã¥ã㊠10 ç§ã§çŽããåé¡ããæ°ã¥ããã«æŸçœ®ãç¶ããã®ã¯çŽç²ãªæå€±ã§ãã
ã ãã鱿¬¡ã§ãå¥åº·èšºæããèªåå®è¡ããã¬ããŒããæ¥ä»ä»ããã¡ã€ã«ã«èç©ããä»çµã¿ãäœããŸãããdiff ãåãã°ãã©ã®é±ãã MCP ãå£ãå§ãããããéå»ã«é¡ã£ãŠç¢ºèªã§ããŸããããªããæè¿é
ãæ°ãããããšããææ§ãªæèŠããã3 é±åã®æ¥æã®ã¬ããŒããã Failed ã 3 ä»¶ã«å¢ããŠããããšããäºå®ã«å€æã§ããã®ã§ãã
ãã®ä»çµã¿ãç¹ã«å¹ãçç±ãããäžã€ãããŸããèªåã§ã¯æ°ã¥ããªãè æã¯ãèªååã§ããæ€åºã§ããªããšããç¹ã§ããæ¯æ¥ Claude Code ã䜿ã£ãŠãããšãããªããšãªãéãããšããæèŠã¯éŸå€ãäžãã£ãŠãããŸãã3 ã¶æåãã 20% é ããªã£ãŠãããããåœããåã«ãªã£ãŠããŸãã鱿¬¡ã®ã¹ãããã·ã§ããããªããã°æ¯èŒã®åºæºã倱ãããŸãã
å šäœã®æµã
ä»çµã¿ã¯ 2 ãã¡ã€ã«ã ãã§ãã蚺æã¹ã¯ãªãããšãããã鱿¬¡ã§èµ·åãã launchd ãžã§ãèšå®ã
[æ¯é±æ¥æ 09:00]
â
âŒ
launchd ã com.shun.env-audit ãèµ·å
â
âŒ
~/.claude/scripts/env-audit.sh ãå®è¡
â
ââ jq ã§ settings.json ãããŒã¹
â ââ enabledPlugins ã®æ°ãååŸ
â
ââ find ã§ plugin ãã£ã¬ã¯ããªãèµ°æ»
â ââ commands / SKILL.md / agents ã®å®ãã¡ã€ã«æ°
â
ââ claude mcp listïŒtimeout 25 ç§ïŒ
â ââ Connected / Needs auth / Failed ãéèš
â
ââ jq ã§ hooks ã®æ§æãåºå
â
ââ ls ~/.claude/skills/auto/ ã§ auto-skill äžèЧ
â
ââ ccusage blocks --active ã§çŽè¿ã³ã¹ããååŸ
â
âŒ
~/.claude/logs/env-audit-YYYYMMDD.md ã«æžãåºã
â
âŒ
diff ã§å鱿¯èŒ â ããã€å£ãããããé¡ãã
ã¹ã¯ãªããã®æ§é
~/.claude/scripts/env-audit.sh 㯠70 è¡ã§ããå
šäœã¯äžã€ã® {} ãããã¯ã§å²ãŸãã Markdown çæããã¡ã€ã«ã«ãªãã€ã¬ã¯ãããæ§é ã«ãªã£ãŠããŸãã
#!/usr/bin/env bash
set -uo pipefail
OUT="${1:-/tmp/claude-env-audit.md}"
SETTINGS="$HOME/.claude/settings.json"
{
# ... Markdown ã echo ã§çæ ...
} > "$OUT"
åŒæ°ãæž¡ããªããã° /tmp/claude-env-audit.md ã«åºåãããŸããlaunchd ããåŒã¶ãšãã¯æ¥ä»ä»ããã¹ãåŒæ°ã§æž¡ããŸãïŒåŸè¿°ïŒã
Plugin Inventory ã»ã¯ã·ã§ã³ã§ã¯ãèšå®ãã¡ã€ã«ãšå®ãã¡ã€ã«ã®äž¡æ¹ãã«ãŠã³ãããŸãã
TOTAL=$(jq -r '.enabledPlugins // {} | length' "$SETTINGS")
echo "- Enabled plugins: **$TOTAL**"
echo "- Plugin commands on disk: **$(find $HOME/.claude/plugins -path '*/commands/*.md' 2>/dev/null | wc -l | tr -d ' ')**"
echo "- Plugin skills on disk: **$(find $HOME/.claude/plugins -name 'SKILL.md' 2>/dev/null | wc -l | tr -d ' ')**"
echo "- Plugin agents on disk: **$(find $HOME/.claude/plugins -path '*/agents/*.md' 2>/dev/null | wc -l | tr -d ' ')**"
enabledPlugins ã®ä»¶æ°ãšãã£ã¹ã¯äžã®å®ãã¡ã€ã«æ°ã®ä¹é¢ãããŸã³ããã¡ã€ã«ãã®ææšã«ãªããŸããèšå®ããå€ããŠããã®ã«ãã£ã¹ã¯ã«æ®ã£ãŠãããã©ã°ã€ã³ã¯ã容éãã䜿ããŸãããæŽç察象ã§ããéã« enabledPlugins ã«èŒã£ãŠããã®ã«ãã£ã¹ã¯ã«ãã¡ã€ã«ããªããã°ããã®ãã©ã°ã€ã³ã¯åããŠããŸããã
MCP Server Status ã»ã¯ã·ã§ã³ãæ žå¿ã§ãã
MCP_OUT=$(timeout 25 claude mcp list 2>&1)
TOTAL_MCP=$(printf '%s' "$MCP_OUT" | grep -cE "://|^plugin:|^claude\.ai")
OK=$(printf '%s' "$MCP_OUT" | grep -c "Connected")
AUTH=$(printf '%s' "$MCP_OUT" | grep -c "Needs auth")
FAIL=$(printf '%s' "$MCP_OUT" | grep -c "Failed to connect")
timeout 25 ãéèŠã§ããMCP ãµãŒããŒãç¡å¿çã®ãšã claude mcp list èªäœããã³ã°ããããšããããŸãã25 ç§ã®ã¿ã€ã ã¢ãŠããèšããããšã§ãå£ãããµãŒããŒããã£ãŠãã¹ã¯ãªããå
šäœãæ¢ãŸããªãèšèšã«ãªã£ãŠããŸãã
éèšçµæã¯ 1 è¡ã®ãµããªãŒãšãFailed / Needs auth ã®è©³çްãªã¹ãã®äž¡æ¹ãåºåããŸãã
echo "- Total: $TOTAL_MCP / Connected: **$OK** / Need auth: **$AUTH** / Failed: **$FAIL**"
ç¶ã Hooks ã»ã¯ã·ã§ã³ã§ã¯ jq ã§ã€ãã³ãçš®å¥ãšç»é²æ°ãäžèЧããŸãã
jq '.hooks | to_entries | map({event: .key, count: (.value | length)})' "$SETTINGS" 2>/dev/null
ããã¯ã¯å¢ãããããåé€ã¯æããšæããããã«ããŽãªã§ãããUserPromptSubmit ã«äœåããã¯ãåºãã£ãŠããããã鱿¬¡ã§ç¢ºèªããããšã§ãæå³ããéè€ããããã¯ãç©ã¿éãªã£ãŠããã®ãæ©æã«æ°ã¥ããŸãã
Auto-skills ã»ã¯ã·ã§ã³ã¯ã·ã³ãã«ã«äžèЧãåºããŸãã
ls "$HOME/.claude/skills/auto/" 2>/dev/null | grep -v README
ç§ã®ç°å¢ã§ã¯çŸåš ~/.claude/skills/auto/ ã« 20 æ¬ä»¥äžã® SKILL.md ãååšããŸããçšéãçµãã£ããã®ãæ®ãç¶ãããšãClaude ãã·ã¹ãã ããã³ããã§èªã¿èŸŒãã³ã³ããã¹ããèšãã¿ãŸãã鱿¬¡ã§äžèЧãç®èŠããããšã§ããããããã°ãããã䜿ã£ãŠãªããªãã«æ°ã¥ããã£ããã«ãªããŸãã
Cost ã»ã¯ã·ã§ã³ã¯çŽè¿ã®çšŒåãããã¯ã®ã³ã¹ããåŒã£åŒµããŸãã
ccusage blocks --active 2>&1 | grep -E "Block|Time|Tokens:|Cost:|/h" | sed 's/^/ /'
MCP ã®æ¥ç¶å€±æãå¢ããé±ã¯ãªãã©ã€ã³ã¹ããäžä¹ããããããšããããŸããMCP ã®ç¶æ ãšã³ã¹ãã®æšç§»ãåãã¬ããŒãã«åããããšã§ãããã®é±ã³ã¹ããè·³ããçç±ã MCP äžå®å®ã ã£ãããšããçžé¢ãåŸããèªã¿åããŸãã
Recommendations ã»ã¯ã·ã§ã³ã¯éŸå€ããŒã¹ã®èªåå€å®ã§ãã
[ "$FAIL" -gt 0 ] && echo "- â ïž $FAIL MCP servers failed. Review/disable to reduce startup time."
[ "$AUTH" -gt 5 ] && echo "- â ïž $AUTH MCP servers unauthenticated. Either auth or disable to reduce noise."
[ "$TOTAL" -gt 50 ] && echo "- â ïž $TOTAL plugins enabled - likely heavy context tax. Consider pruning unused."
éŸå€ã®æ ¹æ ïŒFAIL > 0 ã¯ãŒããã¬ã©ã³ã¹ïŒ1 ä»¶ã§ã倱æããŠããã°èŠå¯ŸåŠïŒãAUTH > 5 ã¯ã5 ä»¶ãŸã§ã¯ãããžã§ã¯ãããšã«èªèšŒåŸ
ã¡ãåºãã蚱容ç¯å²ããšããçµéšå€ãplugins > 50 ã¯ã50 ä»¶ãè¶
ãããšèµ·åæã®ã³ã³ããã¹ã泚å
¥éãäœæã§ããã¬ãã«ã§éããªãããšããçµéšããèšå®ããŸããã
launchd ãžã§ãã®èšå®
~/Library/LaunchAgents/com.shun.env-audit.plist ã鱿¬¡å®è¡ã®ããªã¬ãŒã§ãã
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>9</integer>
<key>Minute</key>
<integer>0</integer>
<key>Weekday</key>
<integer>0</integer>
</dict>
Weekday ã® 0 ãæ¥æã§ããæ¯é±æ¥æ 9:00 ã«èµ·åããŸãã鱿¬¡ã§ã®å®è¡ãæ¥æã®æã«ããçç±ã¯ãææãã䜿ãå§ããåã«ç¶æ
ãææ¡ããŠããããããã§ãã忥ã«å®éšç㪠MCP ã远å ããŠææã«å¿ããããšãããµã€ã¯ã«ãäœåºŠãç¹°ãè¿ããåŸã«æ±ºããŸããã
å®è¡ã³ãã³ãã¯æ¬¡ã®ããã«æ¥ä»ä»ãã®ãã¡ã€ã«åãåçã«çæããŠããŸãã
<string>/bin/zsh -c ~/.claude/scripts/env-audit.sh
~/.claude/logs/env-audit-$(date +\%Y\%m\%d).md > /dev/null 2>&1</string>
plist ã§ã¯ % ããšã¹ã±ãŒãã㊠\%Y\%m\%d ãšæžãå¿
èŠããããŸãããããå¿ãããš launchd ã date ã³ãã³ããæ£ããè§£éã§ããããã¡ã€ã«åãåºå®æååã«ãªã£ãŠããŸããŸãïŒå®éã« 1 åèžã¿ãŸããïŒã
ããã»ã¹ã®åªå 床èšå®ã«ã泚æãå¿ èŠã§ãã
<key>LowPriorityIO</key>
<true/>
<key>Nice</key>
<integer>10</integer>
<key>ProcessType</key>
<string>Background</string>
Nice 10 ã§ã¹ã±ãžã¥ãŒãªã³ã°åªå
床ãäžããLowPriorityIO ã§ I/O ãäœåªå
ã«ããŠããŸããclaude mcp list ã¯å
éšã§æ¥ç¶è©Šè¡ãè¡ããããMac ãã¹ãªãŒããã埩垰ããçŽåŸã®æ¥æ 9:00 ã«å®è¡ããããšä»ã®ããã»ã¹ãžã®åœ±é¿ãåºãŸããããã¯ã°ã©ãŠã³ãèšå®ã§éãããŠããã®ãç¡é£ã§ãã
æšæºåºåãšãšã©ãŒåºåã¯äž¡æ¹ ~/.claude/logs/com.shun.env-audit.log ã«éçŽããŠããŸããã¹ã¯ãªããæ¬äœã®åºåïŒAudit written to: ... ãšå
é 80 è¡ã®ãã¬ãã¥ãŒïŒã¯ããã«æ®ãã®ã§ããlaunchd ãæ¬åœã«åããããã®ç¢ºèªã¯ãã®ãã¡ã€ã«ã tail ããã ãã§æžã¿ãŸãã
diff ã«ããéå»é¡å
ã¬ããŒãã env-audit-20260727.md env-audit-20260803.md ãšèç©ãããã®ã§ãåé±ãšã®å·®å㯠1 ã³ãã³ãã§ç¢ºèªã§ããŸãã
diff ~/.claude/logs/env-audit-20260727.md ~/.claude/logs/env-audit-20260803.md
å žåçãªå€åãã¿ãŒã³ãšããŠïŒ
Connected: **8**âConnected: **5**/Failed: **3**ã®å€åã 1 é±éã§çºçããŠããã°ããã®é±ã«äœããå£ããEnabled plugins: **34**âEnabled plugins: **41**ã®å€åãããã°ããã®é±ã« 7 åã®ãã©ã°ã€ã³ãæå¹åããããšãããã- auto-skill ã®äžèŠ§ã«æ°ããååãå¢ããŠããã°ã誰ãïŒèªåãŸã㯠ClaudeïŒãæ°ããã¹ãã«ãçæãã
ãã® diff éçšãæ¬åœã«åœ¹ã«ç«ã£ãã®ã¯ãã2 é±åãã MCP ã® Failed ãå¢ããŠããããšæ°ã¥ãããšãã§ãããã®é±ã®äœæ¥ãã°ã確èªãããšãç¹å®ã®ãã©ã°ã€ã³ã远å ããçŽåŸãã厩ããŠããããšã倿ãããã®ãã©ã°ã€ã³ãç¡å¹ã«ãããå
ã«æ»ããŸãããæ¥ä»ä»ãã¬ããŒãããªããã°ããªããšãªãçŽã£ããã§çµãã£ãŠããã¯ãã§ãã
å®è£ ã®è©³çް
äžæ¬ãªãã€ã¬ã¯ãããã㯠{ } > "$OUT" ãéžãã çç±
ã¹ã¯ãªããå šäœãæ¬¡ã®æ§é ã«ãªã£ãŠããŸãã
{
# ãã¹ãŠã® echo ãããã«å
¥ã
} > "$OUT"
æåã«æžããããŒãžã§ã³ã¯ echo "..." >> "$OUT" ãåè¡ã§ç¹°ãè¿ãçŽ æŽãªå®è£
ã§ãããåé¡ã¯ããåºãŸãããã¹ã¯ãªãããéäžã§ãšã©ãŒçµäºãããšãã>> 远èšã¢ãŒãã§ã¯ãäœè¡ãæžãããäžéå端ãªãã¡ã€ã«ããæ®ããŸããæ¬¡åã®ã¬ããŒããš diff ãåããšãååã®æ®éªžãæ··å
¥ããŠãã€ãºã«ãªããŸãã
{ } > "$OUT" ãããã¯ã«å€ãããšããã¡ã€ã«ã® open 㯠1 åã§ãããããã¯å
šäœã®åºåããã¹ãŠåããã¡ã€ã«ãã£ã¹ã¯ãªãã¿ã«æµããããããæžã蟌ã¿éäžã§æ¢ãŸã£ãããšããç¶æ
ã¯æžããŸãïŒãã¡ã€ã«èªäœã¯æåã«ãã©ã³ã±ãŒããããŠéãããŸãããæžã蟌ã¿ãšã©ãŒæã®æ®éªžã¯æå°éïŒãããäžã€ã®å©ç¹ã¯å¯èªæ§ã§ããåè¡ã« >> "$OUT" ãä»ãå¿ãããã¹ããªããªããã€ã³ãã³ããæã£ãŠã¬ãã¥ãŒããããã70 è¡ã®ã¹ã¯ãªãããªã®ã«æ§é ã远ããããã®ã¯ãã®ãããã§ãã
timeout 25 ã®æ ¹æ
MCP ã»ã¯ã·ã§ã³ã®æ žå¿éšåãããã§ãã
MCP_OUT=$(timeout 25 claude mcp list 2>&1)
claude mcp list ã¯èšå®ãããŠãããã¹ãŠã® MCP ãµãŒããŒãžæ¥ç¶ã詊ã¿ãŸãããµãŒããŒã stdio åïŒããŒã«ã«ããã»ã¹èµ·åïŒãªã 1 ç§ä»¥å
ã«å¿çããŸããHTTP åã§ãããµãŒããŒãæ£åžžã«åããŠããã° 3 ç§ä»¥å
ãåé¡ã¯ãåããŠããããã«èŠããŠãã³ã°ããŠãããç¶æ
ã®ãµãŒããŒã§ããTCP ã³ãã¯ã·ã§ã³ã¯ç¢ºç«ããããå¿çãæ°žé ã«æ¥ãªãââããŒã«ã«ã§ç«ãŠãéçºçš mock server ããã®ãŸãŸæŸçœ®ãããšãããããèµ·ããŸãã
timeout ãªãã ãš claude mcp list ããã®ãµãŒããŒã«ãããã¯ãããã¹ã¯ãªããå
šäœãæ¢ãŸããŸãã25 ç§ã«ããçç±ã¯ãæ£åžžãªãµãŒããŒãæå€§ã§ã 5 ç§ãå£ãããµãŒããŒã® TCP ã¿ã€ã ã¢ãŠã㯠OS 次第㧠20 ç§ååŸããšããçµéšå€ãããäœè£ã 5 ç§è¶³ããæ°åã§ããå£ãã MCP ã 2 〠3 ã€äžŠãã§ããŠãã¿ã€ã ã¢ãŠãã¯äžŠè¡ããŠåŠçãããã®ã§ã25 ç§ã§æã¡åãã°ååã§ãã
2>&1 ãå
¥ããå Žæãšå
¥ããªãå Žæ
ã¹ã¯ãªããã«ã¯ 2>&1 ãè€æ°ç»å ŽããŸãã䜿ãåãã®åºæºã¯ããã®æ
å ±ãã¬ããŒãã«æ®ããã©ãããã§ãã
MCP_OUT=$(timeout 25 claude mcp list 2>&1) # stderr ãæŸã
find $HOME/.claude/plugins ... 2>/dev/null # stderr ãæšãŠã
ccusage blocks --active 2>&1 | grep -E "..." # stderr ã stdout ã«åæµãããŠãã£ã«ã¿
claude mcp list ã¯æ¥ç¶å€±æã®ã¡ãã»ãŒãžã stderr ã«åºããŸãã2>&1 ãä»ããªããš MCP_OUT ã空ã«ãªããå
šé
ç®ã 0 ã®ã¬ããŒããåºæ¥äžãããŸããæåãããå¿ããŠããŠãå
š MCP Connectedãã®åã¬ããŒãããã°ããä¿¡ããŠããŸããã
find ã® 2>/dev/null ã¯éã§ããã©ã°ã€ã³ãã£ã¬ã¯ããªãååšããªããšãã® "No such file or directory" ãã¬ããŒãã«æ··å
¥ãããªãããã®ãã€ãºé€å»ã§ãã
grep -c ãš :-0 ããã©ã«ã代å
¥ã®é¢ä¿
OK=$(printf '%s' "$MCP_OUT" | grep -c "Connected")
AUTH=$(printf '%s' "$MCP_OUT" | grep -c "Needs auth")
FAIL=$(printf '%s' "$MCP_OUT" | grep -c "Failed to connect")
TOTAL_MCP=${TOTAL_MCP:-0}; OK=${OK:-0}; AUTH=${AUTH:-0}; FAIL=${FAIL:-0}
grep -c 㯠0 ä»¶ã®ãšãã0ããšããæååãæšæºåºåã«åºããŸãããexit code 㯠1 ãè¿ããŸããset -o pipefail ãå¹ããŠããããããã®ãã€ãã©ã€ã³ã® exit status 㯠1 ã«ãªããŸããã¹ã¯ãªããã« set -eïŒerrexitïŒãå
¥ã£ãŠããªãçç±ã¯ããã§ãã-e ãå
¥ãããšãMCP ãµãŒããŒãå
šéš Connected ã ã£ããæ£åžžãªé±ãã« Fail ã 0 ä»¶ â grep -c ã exit 1 â ã¹ã¯ãªããçµäºããšããé説ãèµ·ããŸãã
:-0 ããã©ã«ã代å
¥ã¯å¥ã®ä¿éºã§ããtimeout ãçºç«ããŠã³ãã³ãã匷å¶çµäºãããå Žåãã³ãã³ã眮æã®å€æ°ã空æåã«ãªãå¯èœæ§ããããŸãã空æåã®ãŸãŸ [ "$FAIL" -gt 0 ] ãè©äŸ¡ãããšç®è¡ãšã©ãŒã«ãªãã®ã§ã0 ã«ãã©ãŒã«ããã¯ãããŠããŸãã
Section 6 ã®ç¯äººç¹å®ãã€ãã©ã€ã³
echo "$MCP_OUT" | grep -E "Failed to connect" | grep "^plugin:" \
| awk -F: '{print $2}' | sort -u | head -20 | sed 's/^/- /'
claude mcp list ã®åºåã«ã¯ãMCP ã®ç»é²æ¹æ³ã«ãã£ãŠ plugin:ãã©ã°ã€ã³å:ã¹ãã«å 圢åŒã®è¡ãšãçŽæ¥ URL ã§ç»é²ããè¡ãæ··åšããŸããgrep "^plugin:" ã§ãã©ã°ã€ã³çµç±ã® MCP ã ããçµãã®ã¯ããåé€ãããªããã©ã°ã€ã³ããšç¡å¹åããããšããæäœã®åäœã«åãããããã§ããawk -F: '{print $2}' ã§ã³ãã³åºåãã® 2 çªç®ãã£ãŒã«ãïŒãã©ã°ã€ã³åïŒã ããåãåºããsort -u ã§åããã©ã°ã€ã³ãè€æ°ã® MCP ãæã€å Žåã®éè€ãé€å»ããŠãã head -20 ã§åºåãå¶éããŠããŸãã壿»
çãªç¶æ
ã§ãåºåãæº¢ããªãèšèšã§ãã
launchd ãžã§ãã EnvironmentVariables ãå¿
èŠãšããçç±
plist ã®å é ã«æç€ºç㪠PATH ãå ¥ã£ãŠããŸãã
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>/path/to/nvm/bin:/opt/homebrew/bin:/opt/homebrew/sbin:...</string>
</dict>
launchd ãèµ·åããããã»ã¹ã¯ ~/.zshrc ã ~/.zprofile ãèªã¿ãŸããã/etc/paths çžåœã®æå° PATHïŒ/usr/bin:/bin:/usr/sbin:/sbin çšåºŠïŒããæããªãç¶æ
ã§ã¹ã¯ãªãããèµ°ããŸããclaude ã³ãã³ã㯠nvm 管çäžã® Node.js ãã€ããªãjq 㯠Homebrew çµç±ã®ãã€ããªââã©ã¡ããããã©ã«ã PATH ã«å
¥ã£ãŠããŸããããã®èšå®ãæžããªãå Žåãã¹ã¯ãªããã¯äžèŠæ£åžžã«çµäºããã®ã«ãäžèº«ãã»ãŒç©ºã®ã¬ããŒããåºåãããŸãïŒåã³ãã³ãã command not found ã§å€±æããŠå€æ°ã空ã«ãªãïŒã
ç§ãè©°ãŸã£ã話
ãã®1ïŒlaunchd ãã claude ãèŠããªã
æåã« plist ãäœã£ããšããEnvironmentVariables ãå
¥ãå¿ããŸããã
çç¶ïŒã¬ããŒããã¡ã€ã«ã¯æ¯é±æŽæ°ããããããã MCP ã»ã¯ã·ã§ã³ãèŠããš Connected ã Failed ãå šéš 0ãCost ã»ã¯ã·ã§ã³ã空ãã¹ã¯ãªãããåããŠããã®ã«ã¬ããŒãã空ã
調æ»ïŒtail ~/.claude/logs/com.shun.env-audit.log ãèŠããšæ¬¡ã䞊ãã§ããŸããã
zsh: command not found: claude
zsh: command not found: jq
zsh: command not found: ccusage
Audit written to: /path/to/env-audit-20260720.md
ã¹ã¯ãªããã¯ãšã©ãŒãªãå®èµ°ããŠããŸããset -uo pipefail ã® -uïŒæªå®çŸ©å€æ°ãšã©ãŒïŒãåŒã£ãããããcommand not found 㯠2>&1 ã§å€æ°ã«åã蟌ãŸããã /dev/null ã«æšãŠãããŠãããããã¹ã¯ãªããèªäœã¯çµäºã³ãŒã 0 ã§çµãã£ãŠããŸããããåããŠããããšãæå³ã®ããåºåãåºãŠãããã¯å¥ã®è©±ã ãšãã®ãšãåŠã³ãŸããã
çŽãïŒwhich claude ãå®è¡ããŠã not foundãnvm which current ã§ Node.js ã®ãã¹ãç¹å®ãããã® bin/ ãã£ã¬ã¯ããªã plist ã® EnvironmentVariables > PATH ã«è¿œå ãåæ§ã« /opt/homebrew/bin ã jq çšã«è¿œå ãlaunchctl unload ~/Library/LaunchAgents/com.shun.env-audit.plist && launchctl load ~/Library/LaunchAgents/com.shun.env-audit.plist ã§ãªããŒãããŠãæåã§ã¹ã¯ãªãããèµ°ãããŠå
šã»ã¯ã·ã§ã³ãåãŸãã®ã確èªããŠããçµäºããŸããã
ãã®ãããã°ã§ 2 æé溶ããŸããããcron ç³»ã®ãžã§ã㯠PATH ãæç€ºãããã¯ä»ãåå°çã«ãããŸãã
ãã®2ïŒæ¥ä»ãå±éãããåºå®ãã¡ã€ã«åã«ãªã£ã
çç¶ïŒ~/.claude/logs/ ã« env-audit-20260720.md ã®ãããªæ¥ä»ä»ããã¡ã€ã«ãã§ããã¯ãããenv-audit-%Y%m%d.md ãšãããªãã©ã«ã®ãã¡ã€ã«åã§ 1 ã€ã ãååšãæ¯é±äžæžãããããããdiff ãåããªãã
åå ïŒplist ã® <string> å
ã§ã¯ % èšå·ãç¹æ®æ±ããããŸããdate +%Y%m%d ãšæžããš launchd ã %Y ã %m ããã©ãŒãããæç€ºåãšããŠè§£éããããšããããŸãå±éãããŸãããæ£ãã㯠\%Y\%m\%d ãšãšã¹ã±ãŒãããŸãã
<string>~/.claude/scripts/env-audit.sh ~/.claude/logs/env-audit-$(date +%Y%m%d).md</string>
<string>~/.claude/scripts/env-audit.sh ~/.claude/logs/env-audit-$(date +\%Y\%m\%d).md</string>
ã€ãã§ã«èšããšãplist ã®äžã§ ~ ã¯ããŒã ãã£ã¬ã¯ããªã«å±éãããŸããã絶察ãã¹ã§æžãå¿
èŠããããŸãããããç¥ããã« ~/.claude/logs/... ãšæžãããã~ ãã£ã¬ã¯ããªïŒååšããªãïŒãäœãããšããŠãšã©ãŒã«ãªããŸããã絶察ãã¹ãæžãã»ãã¹ã«ç©ºçœãå
¥ããªãã»% ã¯ãšã¹ã±ãŒãããââãã® 3 ã€ã plist ã®ã«ãŒã«ãšããŠèŠããŠãããšè©°ãŸããã«æžã¿ãŸãã
çŽãïŒãšã¹ã±ãŒããä¿®æ£ãããã¹ã絶察ãã¹ã«å€æŽããŠãªããŒããls -lt ~/.claude/logs/env-audit-*.md ã§æ¥ä»ä»ããã¡ã€ã«ãæ°ããäœãããããšã確èªã
ãã®3ïŒclaude mcp list ã 10 å以äžãã³ã°ãã
æåã®ã¹ã¯ãªããã«ã¯ timeout ããããŸããã§ããã
çç¶ïŒç¹å®ã®é±ãããlaunchd ã®ãã°ãéäžã§æ¢ãŸã£ãŠããŸããhead -80 ã®ãã¬ãã¥ãŒã§åºãã¯ãã® Hooks ã»ã¯ã·ã§ã³ä»¥éãæžãããŠããªãããã¡ã€ã«ã¯ MCP ã»ã¯ã·ã§ã³ã®éäžã§çµãã£ãŠããŸãã
ps aux | grep claude ãå®è¡ãããšãclaude mcp list ã PID ãæã£ãŠå®è¡äžã®ãŸãŸãæå»ã確èªãããš 12 åçµéããŠããŸããã
åå ïŒãã®é±ãããŒã«ã«éçºäžã«å»ºãŠã HTTP å mock MCP ãµãŒããŒã詊ããŠãã³ã³ãããèœãšããã«æŸçœ®ããŠããŸããããµãŒããŒã®ããã»ã¹ã¯æ»ãã§ããããèšå®ããåé€ããŠããªããã claude mcp list ã¯æ¥ç¶ã詊ã¿ç¶ããŸããTCP ã® SYN ã¯å±ããªãããOS ã®æ¥ç¶ã¿ã€ã ã¢ãŠãïŒmacOS ã®ããã©ã«ã㯠75 ç§ååŸïŒãåŸ
ã¡ç¶ããŠããç¶æ
ã§ããå£ãã HTTP MCP ã 1 ã€ãã£ãã ãã§ãã¹ã¯ãªããå
šäœã 1 å以äžãããã¯ãããŠããŸããã
çŽãïŒtimeout 25 claude mcp list 2>&1 ã«å€æŽãããã㊠MCP ã®èšå®ã確èªãã䜿ã£ãŠããªã HTTP åãµãŒããŒã 3 ä»¶åé€ãåé€åŸã®èµ·åæéãäœæã§éããªããŸãããtime timeout 25 claude mcp list ãå®è¡ããã 2.3 ç§ã§çµäºââ以åã¯äœç§ããã£ãŠãããæž¬ãæ°ã«ããªããŸããã§ããã
ãã®ãããã°åŸã«ããªãå£ãã MCP ãæŸçœ®ããŠãããããæ¯ãè¿ããšãåçŽã«ããªã¹ããèŠãŠããªãã£ããããã§ããclaude mcp list ãæåã§æã€ç¿æ
£ããªããã°ãå£ããŠããŠãæ°ã¥ããŸãããç°å¢èšºæãèªååããåæ©ãšããŠããã®ãã³ã°äœéšã¯äžçªå¹ããŸããã
ãã®4ïŒset -uo pipefail ã® -u ãå¥ã®å Žæã§åãã
ã¹ã¯ãªããã®ããåæã®ããŒãžã§ã³ã«ã¯ãline 28 ã® :-0 ããã©ã«ã代å
¥ããããŸããã§ããã
# å€ãããŒãžã§ã³ïŒããã©ã«ã代å
¥ãªãïŒ
OK=$(printf '%s' "$MCP_OUT" | grep -c "Connected")
FAIL=$(printf '%s' "$MCP_OUT" | grep -c "Failed to connect")
echo "- Connected: **$OK** / Failed: **$FAIL**"
çç¶ïŒtimeout 25 claude mcp list ãã¿ã€ã ã¢ãŠãçµäºããé±ïŒã€ãŸã MCP ããã³ã°ããŠããé±ïŒã«ãã¬ããŒãã® MCP ã»ã¯ã·ã§ã³ä»¥éãäœãåºãŠããªãããã°ã«ã¯åºåãªãã
åå ïŒtimeout ãçºç«ãããš exit code 124 ãè¿ããŸããã³ãã³ã眮æ $() ã®äžã§ã¿ã€ã ã¢ãŠãããå Žåãå€åŽã®å€æ°ãžã®ä»£å
¥ã¯å®è¡ãããŸãããMCP_OUT ã®äžèº«ã¯ç©ºæåã«ãªãããšããããŸãïŒ2>&1 ã§åããåºåãéäžã§æã¡åãããããïŒããã®ç¶æ
ã§ grep -c ã«ç©ºã®å
¥åãæµããš 0 ä»¶ãšã㊠FAIL="0" ãèšå®ãããŸãããTOTAL_MCP ã¯å Žåã«ãã£ãŠæªå®çŸ©ã®ãŸãŸåç
§ãããŸãããset -u ããunbound variableããšããŠæ±ãã¹ã¯ãªãããçµäºããŸãã
çŽãïŒTOTAL_MCP=${TOTAL_MCP:-0}; OK=${OK:-0}; AUTH=${AUTH:-0}; FAIL=${FAIL:-0} ã®ããã©ã«ã代å
¥ãããã¯ã远å ãã¿ã€ã ã¢ãŠãæã§ã倿°ã 0 ã«åæããã¬ããŒããæåŸãŸã§çæãããããã«ãªããŸããã:-0 ã¯åãªãåæå€èšå®ã§ã¯ãªããç°åžžç³»ã§ã®ä¿éºã§ãã
4 ã€ã®å€±æã䞊ã¹ãŠæ°ã¥ãããšããããŸããã©ãããã¹ã¯ãªããèªäœã®ãã°ãã§ã¯ãªããç°å¢ã®åæã厩ããããšãžã®å¯ŸåŠäžè¶³ãã§ããPATH ãéãããšã¹ã±ãŒãã«ãŒã«ãéããã¿ã€ã ã¢ãŠãããªããããã©ã«ãå€ããªãââããããåäœã§ã¯äºçްãªããšã§ãããçµã¿åããããšã¬ããŒããåºãªããªããŸãããåããŠããã®ã«æå³ããªããç¶æ ãæãæ€åºãã«ãããã°ã§ããä»ã®ã¹ã¯ãªããã¯ãããããžã®å¯ŸåŠãäžç®æãã€ç©ã¿äžããçµæã§ãã
ã€ãŸãããã€ã³ã
å®è£ ã宿ããŠãããéçšã®æ¬çªã§ããã¹ã¯ãªããå éšã®ãã°ïŒå段ã§4件解説ïŒãšã¯å¥ã«ããå°å ¥åŸã®éçšãã§ãŒãºãã§è©°ãŸãå Žé¢ããããŸããå®éã«äœéšãããã®ã䞊ã¹ãŸãã
launchctl load ã ãã§ã¯ plist ã®å€æŽãåæ ãããªã
plist ãç·šéããåŸãå€ãã®äººãæåã«ããã®ããããäžåºŠ launchctl load ~/Library/LaunchAgents/com.shun.env-audit.plistãã§ããããããžã§ãããã§ã«ããŒããããŠãããš Load failed: 5: Input/output error ãè¿ãããé»ã£ãŠå€±æããŸããã©ã¡ãã®å Žåã倿Žã¯åæ ãããŸãããæ£ããæé 㯠unload ããŠãã load ãçŽãã»ããã§ãã
launchctl unload ~/Library/LaunchAgents/com.shun.env-audit.plist
launchctl load ~/Library/LaunchAgents/com.shun.env-audit.plist
ãã®ã²ãšæéãçããŠããªãã倿Žãå¹ããªãããš30åæ©ãäœéšãå°ãªããšã3åããŸãããä»ã¯ plist ãè§Šã£ããåå°çã« unload && load ãã»ããã§å®è¡ããŸãã
ç»é²ããŠãã1é±éåŸ ããªããšãã¹ãã§ããªããšæã£ãŠãã
ãæ¯é±æ¥æ 9:00 ã«ããåããªãããšæã蟌ã¿ãåååäœç¢ºèªã®ããã«æ¥æãŸã§åŸ
ã£ãè©±ãæ¥ããããã®ã§ããæ¬åœã®ããšã§ããlaunchctl start ã§ä»»æã®ã¿ã€ãã³ã°ã«æåããªã¬ãŒã§ããŸãã
launchctl start com.shun.env-audit
å®è¡çŽåŸã« ~/.claude/logs/com.shun.env-audit.log ã tail ããã°ãã¹ã¯ãªãããèµ°ã£ããã»å
šã»ã¯ã·ã§ã³ãåãŸã£ãŠãããã確èªã§ããŸããlaunchd ãžã§ããç»é²ãããã鱿¬¡ã§åããã©ãããã®åã«ãä»ããåãããã確èªããã®ãã»ãªãªãŒã§ãã
ã¹ã¯ãªãããä¿®æ£ããã®ã«ãªããŒããå¿ããŠå€ãããŒãžã§ã³ãåãç¶ãã
~/.claude/scripts/env-audit.sh ãçŽæ¥ç·šéããŠã¹ã¯ãªããå
éšãæ¹åããå Žåãplist ã¯ãã¹ãåç
§ããŠããã ããªã®ã§ãªããŒãäžèŠã§ããæ¬¡åã®èµ·åãã倿ŽåŸã®å
容ã§åããŸãã
äžæ¹ãplist ã®èšå®ïŒPATHã»ã¹ã±ãžã¥ãŒã«ã»åŒæ°ãªã©ïŒãå€ããå Žå㯠unload && load ãå¿
èŠã§ãããã®2ã±ãŒã¹ãæ··åããŠãã©ã£ã¡ã ã£ãããšæ¯åè¿·ãããããplist ãè§Šã£ããå¿
ããªããŒããã§ã«ãŒã«ãçµ±äžããã»ãã倿ã³ã¹ãããªããªããŸãã
çæãããã¬ããŒãã誰ãèªãŸãªã
èªååã®èœãšã穎ãšããŠæãå
žåçãªã®ããåããŠãããèªãŸããŠããªããç¶æ
ã§ãã~/.claude/logs/ ã« env-audit-20260727.md ãæ¯é±è¿œå ãããŠããŠãã確èªã®åç·ããªããã°æå³ããããŸããã
æåã«äœã£ãä»çµã¿ã¯ãæ¥ææã«ãã°ãçæãããã ããã§ãããææã« Claude Code ãç«ã¡äžãããšããã¬ããŒãã確èªãããã£ããããããŸããã§ããã2ã¶æåŸã«å¶ç¶ãã°ãèŠãã Failed: 3 ã5é±éå䞊ãã§ããããšããå®äœéšããããŸãã
解決çã¯ãèªãä»çµã¿ããå¥ã«çšæããããšã§ããæææã®æåã®ã»ãã·ã§ã³ã§ææ°ã¬ããŒãã®å é è¡ã Claude ã«åŒ·å¶è¡šç€ºãããããã¯ãå ¥ããŠããã察å¿ãç¿é±ã«æã¡è¶ãããã±ãŒã¹ããŒãã«ãªããŸããã
ãã°ãã¡ã€ã«ãç¡éã«å¢ãã
env-audit-YYYYMMDD.md ãæ¯é±è¿œå ãããã®ã§ã1幎ã§52ãã¡ã€ã«ã«ãªããŸãã容éã¯åé¡ãããŸããããls -l ~/.claude/logs/env-audit-*.md ãããšããå€ããã¡ã€ã«ã diff ã®åºæºãææ§ã«ããŸãã
ãçŽè¿3ã¶æåã ãä¿æãããã¯ãªãŒã³ã¢ãããææ¬¡ã§èµ°ããããšç®¡çãããããªããŸãã
find ~/.claude/logs -name "env-audit-*.md" -mtime +90 -delete
ç§ã¯ãã®1è¡ãã¹ã¯ãªããæ«å°Ÿã® } > "$OUT" ãããã¯ã®åŸã«è¿œèšããŠããŸãã管çãããã¡ã€ã«ãå¢ããããã¬ããŒãçæãšåãã¹ã¯ãªããã«ãŸãšããããšã§äžå
管çã§ããŸãã
diff ã倧ããããŠèªããªã
ååŸã®ã¬ããŒããçŽ ã® diff ã§æ¯èŒãããšãCost ã»ã¯ã·ã§ã³ãå®è¡ããšã«å
šè¡å€ãããããã€ãºã«ãªããŸããã»ã¯ã·ã§ã³åäœã§æ¯èŒããã«ã¯ grep ã§çµãã®ãå®çšçã§ãã
# MCPã®ç¶æ
ã ã鱿¬¡æ¯èŒ
grep "Total:\|Connected\|Failed\|Need auth" ~/.claude/logs/env-audit-20260727.md
grep "Total:\|Connected\|Failed\|Need auth" ~/.claude/logs/env-audit-20260803.md
鱿¬¡ã®ç¢ºèªã«30ç§ããããªãæé ã«ããŠããããšã§ã確èªãé¢åããšããæèŠãé²ããŸãã
ccusage ãæªã€ã³ã¹ããŒã«ã§ãéãã«ç©ºã®ãŸãŸã«ãªã
Cost ã»ã¯ã·ã§ã³ïŒSection 5ïŒã¯ ccusage blocks --active ã«äŸåããŠããŸããccusage ãå
¥ã£ãŠããªãç°å¢ã§ã¯ãã»ã¯ã·ã§ã³å
šäœã空ã«ãªããŸããã¹ã¯ãªãã㯠2>&1 ã§ stderr ãæŸã£ãŠããŸãããç¶ã grep -E "Block|Time|Tokens:|Cost:|/h" ãã£ã«ã¿ã§ zsh: command not found: ccusage ã®è¡ãã¹ããããããŸããã€ãŸããCost ã»ã¯ã·ã§ã³ã空ã®ã¬ããŒãããæ¯é±éãã«çæãããŸãã
æ°ããç°å¢ã«ç§»æ€ãããšã㯠which ccusage ã§äºå確èªã確å®ã§ããnvm 管çäžã§ã¯ npm install -g ccusage ã§ã€ã³ã¹ããŒã«ããããšãplist ã® PATH ã« ~/.nvm/versions/node/<ããŒãžã§ã³>/bin ãå«ãŸããŠããããå確èªããŸãã
MCP ã® Failed ããåŸã§çŽãããŸãŸæŸçœ®ãã
ã¬ããŒãã« Failed: 2 ãåºãŠããåŸã§çŽãããšãã®ãŸãŸã«ãããšãç¿é±ãŸã Failed: 2 ãåºãŸãããåŸã§ãã¯æ¥ãŸãããHTTP å MCP ã®åé€ã¯ claude mcp remove <name> ã®1ã³ãã³ãã§3ç§ã§ããã¹ã¯ãªããã®éŸå€ã FAIL > 0ïŒãŒããã¬ã©ã³ã¹ïŒã«ããŠããçç±ã¯ã1ä»¶ã§ã蚱容ãããšã2ä»¶ãŸã§ OKããšããéçšã«æ»èœããããã§ããRecommendations ã»ã¯ã·ã§ã³ã« â ïž 1 MCP servers failed. ãåºããã確èªããæ¥ã®ãã¡ã«åŠçããŸãã
launchctl list ã§ãžã§ãç¶æ
ã確èªããæ¹æ³ãç¥ããªã
launchctl list com.shun.env-audit
ãã®ã³ãã³ã㯠PIDïŒå®è¡äžãªãæ°åã»åæ¢äžãªã -ïŒãšååã®çµäºã³ãŒãïŒLastExitStatusïŒãè¿ããŸããLastExitStatus ã 0 以å€ãªãã¹ã¯ãªãããç°åžžçµäºããŠããŸãããã°ã tail ããåã«ããŸããã®ã³ãã³ãã§ãèµ°ã£ããããæ£åžžçµäºããããã1ç§ã§ç¢ºèªã§ããŸããååšãç¥ããªããšããåããŠããã¯ããªã®ã«ããšããç¶æ
ã§è©°ãŸãç¶ããŸãã
nvm ã®ããŒãžã§ã³æŽæ°åŸã« plist ã® PATH ãå€ããŸãŸã«ãªã
nvm ã§ Node.js ã®ããŒãžã§ã³ãäžãããšããã€ããªã®ãã¹ãå€ãããŸããããšãã° v24.13.0 ãã v24.15.0 ã«äžããå Žåãplist ã«æžãã ~/.nvm/versions/node/v24.13.0/bin ã®ãã£ã¬ã¯ããªãååšããªããªããŸãããã®é±ãã claude mcp list ãåãããMCP ã»ã¯ã·ã§ã³ãå
šéš 0 ã®ã¬ããŒãã«ãªããŸããnvm ã§ããŒãžã§ã³ãå€ããã which claude ãå®è¡ããŠãplist ã® PATH ãæŽæ°ããŠãªããŒãããã®ãã»ããã§ãã
ãã¹ããã©ã¯ãã£ã¹
1. ç»é²çŽåŸã«æåããªã¬ãŒã§å šã»ã¯ã·ã§ã³ã確èªãã
launchctl load ã®çŽåŸã« launchctl start com.shun.env-audit ãå®è¡ããŸãã~/.claude/logs/com.shun.env-audit.log ã tail ããŠãMCP ã»ã¯ã·ã§ã³ã«æ°å€ãåºãŠãããã»Cost ã»ã¯ã·ã§ã³ã«å€ãããããç®èŠããŸããããã§ MCP ããTotal: 0 / Connected: 0ããªã PATH ã®åé¡ã§ããæåã«å
šã»ã¯ã·ã§ã³ç¢ºèªãæžãŸããŠããã°ããäœé±éã空ã¬ããŒããæ¥ãŠããããåŸããçºèŠããã³ã¹ãããŒãã«ãªããŸãã
2. plist ã® PATH 㯠which ã§ç¢ºèªããŠããæžã
which claude # ~/.nvm/versions/node/v24.13.0/bin/claude
which jq # /opt/homebrew/bin/jq
which ccusage # ~/.nvm/versions/node/v24.13.0/bin/ccusage
äžèš3ã³ãã³ãã® bin/ éšåãæœåºã㊠plist ã® PATH ã«äžŠã¹ãŸããnvm ã§ããŒãžã§ã³ãäžããéãåã確èªã³ãã³ãã§å·®åãå³åº§ã«ããããŸãã
3. plist å€æŽæã¯ unload && load ãã»ããã§
plist ãè§Šã£ããå¿
ã launchctl unload ~/Library/LaunchAgents/com.shun.env-audit.plist && launchctl load ~/Library/LaunchAgents/com.shun.env-audit.plist ã®ã»ããã§å®è¡ããŸãããã¹ã¯ãªããã®å€æŽã¯ãªããŒãäžèŠã»plist ã®å€æŽã¯ãªããŒãå¿
èŠããšãã倿ãéœåºŠããããããplist ãè§Šã£ããå¿
ããªããŒããã§çµ±äžããã»ããå®å
šã§ãã
4. plist ã® Label ã¯èªåã®ãã³ãã«ã§åå空éãäœã
com.shun.env-audit ã® shun éšåãèªåã®ãã³ãã«ã«å€ããŸããè€æ°ã® launchd ãžã§ããå¢ããŠãããšããlaunchctl list | grep com.èªåã®ãã³ãã« ã§èªåã®ãžã§ãã ããçµã蟌ããŸããä»ã®ããŒã«ãèªåçæãããžã§ããšæ··åšããŠãå€å¥ã§ããŸãã
5. timeout ã®ç§æ°ã¯ãMCP æ° Ã 5 ç§ããç®å®ã«ãã
timeout 25 ã¯åœæã® MCP ç»é²æ°ããèšç®ããæ°å€ã§ããæ£åžžãª MCP 5 ä»¶ à æå€§ 5 ç§ = 25 ç§ãæ ¹æ ã§ããMCP ã 30 件以äžããç°å¢ã§ã¯ timeout 60 ã«åŒãäžããããMCP èªäœãæŽçããã»ããæ ¹æ¬è§£æ±ºã§ããã¿ã€ã ã¢ãŠãå€ãäžãç¶ãããšãå£ãã MCP ãæŸçœ®ããŠãåãä»çµã¿ãã«å€è³ªããŸããã¹ã¯ãªããã®ä¿®æ£ãã MCP ã®æŽçãå
ã«ããŸãã
6. FAIL > 0 ã¯ãŒããã¬ã©ã³ã¹ã»ç¢ºèªæ¥ã®ãã¡ã«å¯ŸåŠãã
Failed ã 1 ä»¶ã§ãåºãã確èªããæ¥ã®ãã¡ã« claude mcp remove <name> ã claude mcp auth <name> ã§å¯ŸåŠããŸããHTTP å MCP ã®åé€ã¯3ç§ãstdio åã®åèªèšŒã¯1ã³ãã³ãã§ãããåŸã§ãã¯ãæ°žä¹
ã«ãã«å€ãããŸãã
7. auto-skill ã®åé€åºæºãæç¢ºã«æ±ºãã
ls ~/.claude/skills/auto/ ã®äžèЧãèŠããšããæåŸã« Claude ã䜿ã£ãã®ã¯ãã€ãããåããããŸããå幎以äžåŒã°ããèšæ¶ããªãã¹ãã«ã¯åé€åè£ã§ããåé€åºæºããªããã°ã¹ãã«ã¯ééãªãå¢ããã³ã³ããã¹ãçšãéãã«äžããç¶ããŸãããå幎䜿ããªããã°åé€ããšããã«ãŒã«ãèšããŠããã~/.claude/skills/auto/ ã®ãã¡ã€ã«æ°ã管çå¯èœãªç¯å²ã«åãŸããŸããã
8. diff ãèªãåã«ç¹å®ã»ã¯ã·ã§ã³ã ã grep ãã
å šæ diff ã¯èªãã®ã«æéãããããŸãããä»é± MCP ãå£ããããã ããç¥ããããªãã
grep "Total:\|Connected\|Failed" ~/.claude/logs/env-audit-20260727.md
grep "Total:\|Connected\|Failed" ~/.claude/logs/env-audit-20260803.md
ã§ã»ã¯ã·ã§ã³ãçµããŸãã30 ç§ä»¥å ã«ç¢ºèªã§ããæé ã«ããŠããããšã§ã確èªãé¢åããé²ããŸãã
9. ã¬ããŒãããèªãä»çµã¿ããå¥ã«çšæãã
çæã ãèªååããŠèªãåç·ããªããã°ãã¬ããŒãã¯ç¡æå³ã§ããæææã®æåã®ã»ãã·ã§ã³ã§ææ°ã¬ããŒãã Claude ã«åŒ·å¶è¡šç€ºãããããã¯ã远å ããããSlack ã® webhook ã§èŠçŽãéããã®ã©ã¡ãããçµã¿åãããŸããã鱿¬¡ã§èšºæâé±ã®æåã®ã»ãã·ã§ã³åã«ææ¡âãã®å Žã§å¯ŸåŠãã®ãµã€ã¯ã«ãæç«ããŠåããŠãã®ä»çµã¿ã䟡å€ãæã¡ãŸãã
10. ã¹ã¯ãªããèªäœãããŒãžã§ã³ç®¡çãã
~/.claude/scripts/ ããš private 㪠dotfiles ãªããžããªã«å
¥ããã¹ã¯ãªããã®æ¹åã®ãã³ã«ã³ãããããŸããããªããã®è¡ãå€ããããã®æèãæ®ããã3ã¶æåã®ããŒãžã§ã³ã«æ»ããããã10ç§ã§å®çµããŸããã¹ã¯ãªãããåäœãã¡ã€ã«ã§ç®¡çããŠãããšãå£åããŠããã®åå 远跡ãå°é£ã«ãªããŸãã
11. ãã©ã°ã€ã³è¿œå åŸã¯å³åº§ã« claude mcp list ã§ç¢ºèªãã
æ°ãããã©ã°ã€ã³ã远å ãããããã®å Žã§ claude mcp list ãæã£ãŠ Failed ãåºãŠããªããã確èªããŸãã鱿¬¡ã¬ããŒããåŸ
ãããèšæ¶ãšç¶æ
ãäžèŽããçŽåŸã«ç¢ºèªããããšã§ãã©ã®ãã©ã°ã€ã³ãåå ãããèªæãªç¶æ
ã§åé¡ãçºèŠã§ããŸãã
12. launchctl list com.shun.env-audit ã§ãžã§ãç¶æ
ã1ç§ã§ç¢ºèªãã
launchctl list com.shun.env-audit
PIDïŒå®è¡äžãªãæ°åã»åæ¢äžãªã -ïŒãš LastExitStatusïŒ0 以å€ãªãç°åžžçµäºïŒãè¿ããŸãããã°ãèªãåã«ãŸãããã§ãèµ°ã£ãããã確èªããŸãã
13. ãŸã³ããã¡ã€ã«ã3ã¶æã«1åäžæãã
enabledPlugins ããåé€ãããŠããã£ã¹ã¯ã«æ®ããã©ã°ã€ã³ãã¡ã€ã«ã¯ find ã®èµ°æ»å¯Ÿè±¡ã«å
¥ãç¶ããŸãããPlugin commands on disk: 83ããªã®ã«ãEnabled plugins: 31ããªã52ãã¡ã€ã«ããŸã³ãã§ãã3ã¶æã«äžåºŠ ~/.claude/plugins/ 以äžãçŽæ¥ç¢ºèªãã察å¿ãããã©ã°ã€ã³ãç¡å¹åãããŠãããã£ã¬ã¯ããªã rm -rf ã§æŽçããŸãã
14. ãã©ã°ã€ã³æ°ã®éŸå€ã¯èªåã®äœæã«åãããŠèª¿æŽãã
ã¹ã¯ãªããã® TOTAL > 50 ãšããéŸå€ã¯ç§ã®ç°å¢ã§ã®çµéšå€ã§ããã³ãã³ãã ãã®ãã©ã°ã€ã³ãšã¹ãã«ã»ãšãŒãžã§ã³ããæã€ãã©ã°ã€ã³ã§ã¯ã³ã³ããã¹ãçšã®éããéããŸãããéãããšæãå§ããæç¹ã®ãã©ã°ã€ã³æ°ãèšé²ãããã®å€ à 0.8 ãèŠåéŸå€ã«èšå®ããã®ãçŸå®çãªèª¿æŽæ³ã§ãã
15. find ~/.claude/logs -name "env-audit-*.md" -mtime +90 -delete ãã¹ã¯ãªããæ«å°Ÿã«è¿œèšãã
ãã°ããŒããŒã·ã§ã³ãã¹ã¯ãªããæ¬äœã«çµã¿èŸŒãããšã§ãã3ã¶æã§å€ãã¬ããŒããèªååé€ãã远å èšå®ãªãã«åããŸãã} > "$OUT" ã®åŸã®æ«å°Ÿã«1è¡è¿œå ããã ãã§ããã¬ããŒãçæãšæŽçãåãã¹ã¯ãªããã«åãŸãã管çãããžã§ããå¢ããŸããã
ãŸãšã
ãç°å¢ãè ãããšããæèŠã¯ããšããšææ§ã§ããMCP ã®æ¥ç¶å€±æãå¢ããŠããauto-skill ã墿®ããŠãããã®é±ã«èªåãããã«æ°ã¥ãããšã¯ã»ãŒãããŸãããæ°ã¥ããªããŸãŸäœ¿ãç¶ãããšãã³ã³ããã¹ãçšã®å¢å ã»èµ·åé å»¶ã»ãªãã©ã€ã³ã¹ãã®äžä¹ããå°ããã€ç©ã¿éãªããæ°ã¶æåŸã«ããªããæè¿é ããªããšããæèŠã ããæ®ããŸãã
env-audit.sh ãš launchd ãžã§ãã解決ããã®ã¯ãæ°ã¥ããªãåé¡ãã§ãã70è¡ã®ã¹ã¯ãªããã鱿¬¡ã§çŸç¶ã®ã¹ãããã·ã§ãããäœããæ¥ä»ä»ãã§èç©ããdiff ã«ãã£ãŠããã€ããå£ãããããé¡ããèšé²ãäœãââããã ãã§ããé£ããæè¡ã¯äžå䜿ã£ãŠããŸããã
æå 0 åãã 120 äžãŸã§æã£ãŠããéçšã§åŠãã ã®ã¯ããéå ·ãå¢ããããšããšãéå ·ãç¶æããããšãã¯å¥ã®ã³ã¹ããããããšããäºå®ã§ãã远å ã¯ç¬éã§ããã管çã¯æ¯é±ã§ãã远å ã®ãã³ã«ç®¡çã³ã¹ããç©ã¿äžãããŸãããããèªååã§ååããªãéããç°å¢ã¯æ©èœã§ã¯ãªãè² åµãšããŠå¢ãç¶ããŸãã
鱿¬¡ã®å¥åº·èšºæã¯ããã®ã³ã¹ãã Claude ã«æãããä»çµã¿ã§ããMCP ãå£ããŠãããã©ããã人éãæ°ã«ããªããŠããç¶æ ãã人éã®æèãæ¬æ¥ã®äœæ¥ã«éäžãããŸãã
ä»çµã¿ã®å šäœåã»æ120äžã®å èš³ã»30æ¥æé ã¯æænoteã«ãŸãšããŠããŸãã ð Claude CodeèªåŸç°å¢ã§ãå®éã©ã皌ãã â ä»çµã¿ã»å®äŸã»å§ãæ¹ã»ãµããŒã
LilyïŒ@bokuwalilyïŒâ å人éçºè ãClaude Code ã§èªåååºç€ãçµã¿ãªãããiOSã¢ããªãWebãµãŒãã¹ãéç£ããŠããŸã
- AIã§ãå¯ãŠãŠãåãä»çµã¿ããäœã£ãŠæ120äžã«ãã話㯠noteã®ææèšäº ã«ð°
- OSS: github.com/bokuwalily ð
- ææ°æ å ±ã»ãåãåãã㯠X @bokuwalily ãžð
çããã® â€ïž ãã·ã§ã¢ãå±ã¿ã«ãªããŸãïŒ