Skip to content

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 ツールに対応しています
  • フックスクリプトのエラーはセッションのデバッグログで確認できます

関連情報