PostToolUse フック: すべてのツール出力を置き換え可能に
原文(日本語に翻訳)
PostToolUse フックは hookSpecificOutput.updatedToolOutput を通じてすべてのツールのツール出力を置き換えられるようになりました(以前は MCP のみ対応)。
原文(英語)
PostToolUse hooks can now replace tool output for all tools via hookSpecificOutput.updatedToolOutput (previously MCP-only)
概要
Claude Code v2.1.121 では、PostToolUse フックの機能が拡張されました。これまで hookSpecificOutput.updatedToolOutput によるツール出力の置き換えは MCP ツールのみに限られていましたが、今回の更新で Bash ツール、Read ツール、Write ツールなど すべての組み込みツール に対しても出力を置き換えられるようになりました。ツール実行結果のフィルタリング・変換・機密情報のマスキングなど、柔軟な後処理が可能です。
基本的な使い方
json
// .claude/settings.json
{
"hooks": {
"PostToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "node .claude/hooks/sanitize-output.js"
}
]
}
]
}
}フックスクリプトが hookSpecificOutput.updatedToolOutput を含む JSON を返すと、ツールの出力が置き換えられます。
実践例
機密情報のマスキング
javascript
// .claude/hooks/mask-secrets.js
const input = JSON.parse(process.stdin.read() || '{}');
const toolOutput = input.tool_output || '';
// 環境変数やシークレットをマスク
const masked = toolOutput
.replace(/sk-[a-zA-Z0-9]{32,}/g, 'sk-***MASKED***')
.replace(/password=\S+/gi, 'password=***');
if (masked !== toolOutput) {
// 出力が変更された場合のみ置き換え
console.log(JSON.stringify({
hookSpecificOutput: {
updatedToolOutput: masked
}
}));
}Bash 出力の整形
javascript
// .claude/hooks/format-bash-output.js
const input = JSON.parse(process.stdin.read() || '{}');
if (input.tool_name === 'Bash') {
const output = input.tool_output || '';
// ANSI エスケープシーケンスを除去してクリーンな出力に
const clean = output.replace(/\x1b\[[0-9;]*m/g, '');
console.log(JSON.stringify({
hookSpecificOutput: {
updatedToolOutput: clean
}
}));
}全ツールに共通のログ付加
bash
#!/bin/bash
# .claude/hooks/append-metadata.sh
# 全ツール出力にタイムスタンプを付加
INPUT=$(cat)
TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name')
TOOL_OUTPUT=$(echo "$INPUT" | jq -r '.tool_output')
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
UPDATED="[${TIMESTAMP}] Tool: ${TOOL_NAME}\n${TOOL_OUTPUT}"
echo "{\"hookSpecificOutput\": {\"updatedToolOutput\": $(echo "$UPDATED" | jq -Rs .)}}"注意点
- フックが出力を置き換えた場合、Claude はオリジナルの出力ではなく置き換えられた出力を参照します
hookSpecificOutput.updatedToolOutputを返さない場合は元の出力が使われます- すべての組み込みツール(Bash、Read、Write、Edit など)および MCP ツールに対応しています
- フックスクリプトのエラーはセッションのデバッグログで確認できます