Skip to content

原文(日本語に翻訳)

新しい Elicitation および ElicitationResult フックを追加しました。応答がMCPサーバーに送り返される前に傍受・上書きできます

原文(英語)

Added new Elicitation and ElicitationResult hooks to intercept and override responses before they're sent back

概要

Elicitation フックはMCPサーバーがユーザー入力を要求した際に発火し、インタラクティブなダイアログを表示せずにプログラムで自動応答できます。ElicitationResult フックはユーザーが応答した後、その内容がMCPサーバーへ送信される前に発火し、応答の観察・変更・ブロックが可能です。これにより、繰り返し発生するエリシテーションの自動化やセキュリティポリシーの適用が実現できます。

基本的な使い方

Elicitationフック(自動応答)

MCPサーバーからの入力要求に自動で応答します。

json
// .claude/settings.json
{
  "hooks": {
    "Elicitation": [
      {
        "matcher": "my-mcp-server",
        "hooks": [
          {
            "type": "command",
            "command": ".claude/hooks/handle-elicitation.sh",
            "timeout": 10
          }
        ]
      }
    ]
  }
}

フック入力(標準入力で受け取るJSON):

json
{
  "hook_event_name": "Elicitation",
  "mcp_server_name": "my-mcp-server",
  "message": "認証情報を入力してください",
  "mode": "form",
  "requested_schema": {
    "type": "object",
    "properties": {
      "username": { "type": "string", "title": "ユーザー名" },
      "api_key": { "type": "string", "title": "APIキー" }
    }
  }
}

フック出力(応答JSON):

json
{
  "hookSpecificOutput": {
    "hookEventName": "Elicitation",
    "action": "accept",
    "content": {
      "username": "alice",
      "api_key": "sk-xxxx"
    }
  }
}

ElicitationResultフック(応答の傍受)

ユーザーが入力した内容をMCPサーバーへ送信する前に確認・変更します。

json
// .claude/settings.json
{
  "hooks": {
    "ElicitationResult": [
      {
        "matcher": "sensitive-server",
        "hooks": [
          {
            "type": "command",
            "command": ".claude/hooks/validate-elicitation-result.sh"
          }
        ]
      }
    ]
  }
}

実践例

ユースケース1: CI/CD環境での自動認証

CI/CDパイプライン内でMCPサーバーへの認証を自動化する例:

bash
#!/bin/bash
# .claude/hooks/handle-elicitation.sh

INPUT=$(cat)
SERVER=$(echo "$INPUT" | jq -r '.mcp_server_name')

if [ "$SERVER" = "deploy-server" ]; then
  # 環境変数から認証情報を取得
  echo "{
    \"hookSpecificOutput\": {
      \"hookEventName\": \"Elicitation\",
      \"action\": \"accept\",
      \"content\": {
        \"token\": \"$DEPLOY_TOKEN\",
        \"environment\": \"$TARGET_ENV\"
      }
    }
  }"
else
  # 対応しないサーバーはダイアログを表示させる(フック出力なし)
  exit 0
fi

ユースケース2: 機密情報のフィルタリング(ElicitationResult)

ユーザーが誤って機密情報を入力しようとした場合にブロックする:

bash
#!/bin/bash
# .claude/hooks/validate-elicitation-result.sh

INPUT=$(cat)
CONTENT=$(echo "$INPUT" | jq -r '.content')

# 本番DBのパスワードパターンを検出
if echo "$CONTENT" | grep -q "prod-password"; then
  echo "本番環境の認証情報が検出されました。本番サーバーへの接続を許可しません。" >&2
  # exit code 2でブロック(actionをdeclineに変更)
  exit 2
fi

# 問題なければそのまま通過
exit 0

ユースケース3: アクションログの記録

すべてのエリシテーション応答を監査ログに記録する:

bash
#!/bin/bash
# .claude/hooks/log-elicitation.sh

INPUT=$(cat)
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
SERVER=$(echo "$INPUT" | jq -r '.mcp_server_name')
ACTION=$(echo "$INPUT" | jq -r '.action')

echo "[$TIMESTAMP] Elicitation: server=$SERVER action=$ACTION" >> ~/.claude/elicitation-audit.log

# ログのみ記録して処理は継続
exit 0

注意点

  • Elicitationフックの出力なし: フックが終了コード0で出力なしの場合、通常のインタラクティブダイアログが表示されます
  • ElicitationResultのブロック: 終了コード2で終了するとMCPサーバーへの応答が decline に変更されます
  • マッチャー: フックのマッチャーにMCPサーバー名を指定してフィルタリングできます
  • 対応するフック型: command 型のみサポートしています
  • セキュリティ: フック内でAPIキーや認証情報を扱う場合は環境変数を使用し、スクリプトに直接書き込まないようにしてください

関連情報