原文(日本語に翻訳)
アシスタントのメッセージテキストを表示時に変換または非表示にできる MessageDisplay フックイベントを追加しました。
原文(英語)
Added a MessageDisplay hook event that lets hooks transform or hide assistant message text as it is displayed
概要
新しい MessageDisplay フックイベントにより、Claude のアシスタントメッセージが画面に表示される際に、そのテキストを変換したり非表示にしたりできます。これにより、出力のフィルタリング、特定パターンの置換、カスタムフォーマット適用など、表示レイヤーでの柔軟なカスタマイズが可能になります。
基本的な使い方
settings.json に MessageDisplay フックを登録します。
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(ストリーミング中かどうか)フィールドが含まれます