Skip to content

原文(日本語に翻訳)

アシスタントのメッセージテキストを表示時に変換または非表示にできる MessageDisplay フックイベントを追加しました。

原文(英語)

Added a MessageDisplay hook event that lets hooks transform or hide assistant message text as it is displayed

概要

新しい MessageDisplay フックイベントにより、Claude のアシスタントメッセージが画面に表示される際に、そのテキストを変換したり非表示にしたりできます。これにより、出力のフィルタリング、特定パターンの置換、カスタムフォーマット適用など、表示レイヤーでの柔軟なカスタマイズが可能になります。

基本的な使い方

settings.jsonMessageDisplay フックを登録します。

json
{
  "hooks": {
    "MessageDisplay": [
      {
        "hooks": [
          {
            "type": "command",
            "command": ".claude/hooks/message-display.sh"
          }
        ]
      }
    ]
  }
}

フックスクリプトは標準入力からメッセージ情報を JSON で受け取り、hookSpecificOutput.displayContent フィールドで変換後のテキストを返します。

実践例

機密情報のマスキング

出力に含まれる可能性のある機密情報(APIキー・パスワードなど)をマスクする例です。

bash
#!/bin/bash
# .claude/hooks/message-display.sh

# 標準入力から JSON を読み取り
INPUT=$(cat)
MESSAGE=$(echo "$INPUT" | jq -r '.message_text')

# APIキーのパターンをマスク
MASKED=$(echo "$MESSAGE" | sed 's/sk-[a-zA-Z0-9]\{20,\}/sk-***/g')
MASKED=$(echo "$MASKED" | sed 's/password = [^ ]*/password = ***/gi')

jq -n --arg content "$MASKED" '{
  "hookSpecificOutput": {
    "hookEventName": "MessageDisplay",
    "displayContent": $content
  }
}'

社内専門用語への変換

出力に含まれる特定の用語を社内用語に変換する例です。

bash
#!/bin/bash
# .claude/hooks/message-display.sh

INPUT=$(cat)
MESSAGE=$(echo "$INPUT" | jq -r '.message_text')

# 用語の変換(例)
CONVERTED=$(echo "$MESSAGE" \
  | sed 's/production/本番環境/g' \
  | sed 's/staging/ステージング環境/g')

jq -n --arg content "$CONVERTED" '{
  "hookSpecificOutput": {
    "hookEventName": "MessageDisplay",
    "displayContent": $content
  }
}'

特定コンテンツの非表示

条件に基づいてメッセージ全体を非表示にする例です(displayContent を空にすることで非表示)。

bash
#!/bin/bash
# .claude/hooks/message-display.sh

INPUT=$(cat)
MESSAGE=$(echo "$INPUT" | jq -r '.message_text')

# デバッグ出力が含まれる場合に非表示
if echo "$MESSAGE" | grep -q "DEBUG:"; then
  echo '{
    "hookSpecificOutput": {
      "hookEventName": "MessageDisplay",
      "displayContent": ""
    }
  }'
  exit 0
fi

# 変更なしの場合は元のテキストをそのまま返す
jq -n --arg content "$MESSAGE" '{
  "hookSpecificOutput": {
    "hookEventName": "MessageDisplay",
    "displayContent": $content
  }
}'

注意点

  • MessageDisplay フックは画面表示テキストのみを変更します。トランスクリプトファイルや次のターンへのコンテキストは元のテキストが使われます
  • displayContent を空文字列にするとそのメッセージは画面に表示されなくなります
  • ブロッキング機能はなく、表示専用イベントです
  • 高頻度で呼び出されるため、フックの処理は軽量に保つことを推奨します
  • フックがエラーを返した場合は、元のメッセージがそのまま表示されます
  • 入力 JSON には message_text(テキスト)と is_streaming(ストリーミング中かどうか)フィールドが含まれます

関連情報