Log Every Elicitation Decision for an MCP Trust Register
Distinct from the blocking elicitation hooks above: this one never declines anything, it just logs that a server asked, so you have a complete register of every elicitation dialog a connected MCP server has ever triggered — the raw material for a periodic MCP-trust review.
1. Save this as the hook script
#!/usr/bin/env python3
"""Elicitation hook — logs every elicitation request to a durable
register. Observational only."""
import json, sys, datetime
from pathlib import Path
data = json.load(sys.stdin)
log_path = Path(data.get("cwd", ".")) / ".claude" / "elicitation_register.jsonl"
log_path.parent.mkdir(parents=True, exist_ok=True)
entry = {
"ts": datetime.datetime.utcnow().isoformat() + "Z",
"server_name": data.get("server_name"),
"session_id": data.get("session_id"),
}
with open(log_path, "a") as f:
f.write(json.dumps(entry) + "\n")
sys.exit(0)
Save to a path inside your project, e.g. .claude/hooks/log-elicitation-decisions-register.sh, then chmod +x it.
2. Wire it into .claude/settings.json
{
"hooks": {
"Elicitation": [
{
"hooks": [
{"type": "command", "command": "python3 .claude/hooks/log-elicitation-decisions-register.py"}
]
}
]
}
}
Before you use this
A hook runs with your local shell's permissions — review the script above before adding it, the same way you'd review any script you didn't write yourself. See our guide on hook security risks for the specific CVEs this category of feature has already produced.
Related hooks