v2.1.121 で追加された2つの機能 — MCP alwaysLoad オプションとPostToolUseフックの全ツール対応 — の実践的な使い方をまとめる。
alwaysLoad — よく使うサーバーは常時ロードにするClaude Codeはデフォルトで多くのMCPツールを「遅延ロード(deferred)」として扱う。利用可能にするには ToolSearch を呼び出して明示的にスキーマを取得する必要があり、Claude が自動では使ってくれないことがある。
alwaysLoad: true を設定すると、そのサーバーのツールはセッション開始時から常に利用可能になる。
// ~/.claude/settings.json または .claude/settings.json
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/project"],
"alwaysLoad": true
},
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_TOKEN": "your-token"
},
"alwaysLoad": true
}
}
}
起動が若干重くなるトレードオフがあるため、たまにしか使わないサーバーはデフォルト(遅延ロード)のままにする方がよい。
hookSpecificOutput.updatedToolOutput を返すことで、ツールの出力をClaudeが読み取る前に変換できる。
// .claude/settings.json
{
"hooks": {
"PostToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "/path/to/mask-secrets.sh"
}
]
}
]
}
}
#!/bin/bash
# mask-secrets.sh
# stdinからツール出力を読み取り、機密情報をマスクしてstdoutに出力
input=$(cat)
# 例: AWS アクセスキーをマスク
masked=$(echo "$input" | sed 's/AKIA[A-Z0-9]\{16\}/[AWS_KEY_MASKED]/g')
echo "$masked"
フックがstdoutに出力した内容が updatedToolOutput として使われる。Claude にはマスク後の内容のみが渡される。
ビルドログなど長大な出力を最初の50行 + 最後の20行に絞り込むフックを挟めば、コンテキストを節約できる。
#!/bin/bash
# trim-output.sh
input=$(cat)
line_count=$(echo "$input" | wc -l)
if [ "$line_count" -gt 100 ]; then
head_lines=$(echo "$input" | head -50)
tail_lines=$(echo "$input" | tail -20)
echo "$head_lines"
echo "... [中略: $((line_count - 70)) 行省略] ..."
echo "$tail_lines"
else
echo "$input"
fi
v2.1.118 から PostToolUse フックで type: "mcp_tool" が使えるようになっており、MCPツールの出力も同様に加工できる:
{
"hooks": {
"PostToolUse": [
{
"matcher": "mcp__my-server__my-tool",
"hooks": [
{
"type": "mcp_tool",
"server_name": "hooks-server",
"tool_name": "process_output"
}
]
}
]
}
}
alwaysLoad とPostToolUseフックはどちらも「Claude Code の動作を自分のワークフローに合わせて調整する」ための仕組み。特にチーム環境でコンプライアンス要件があるプロジェクトでは、フックによる出力サニタイズが実用的な解になると思われる。