Skip to content
GitHub

PEP

판정을 PreToolUse 훅과 agentgateway의 ext_authz에서 실제로 집행합니다.

PEP(Policy Enforcement Point)는 Decision Module의 판정을 도구가 실행되기 전에 집행합니다. 호출을 막는 곳은 두 군데입니다.

  • 내장 도구: PreToolUse 훅 응답으로 막습니다.
  • MCP 도구: agentgateway의 ext_authz 응답으로 막습니다. agentgateway가 tools/call을 받으면 ext_authz로 엔진에 판정을 묻고, PEP는 PreToolUse에서 나온 판정을 tool_use_id로 찾아 답합니다.
Claude Code훅WithHuman 엔진PEPagentgatewayMCP 서버PreToolUse판정훅 응답tools/callext_authztool_use_id로 판정 조회허용 또는 거부판정이 없으면 거부tools/call허용된 경우만
MCP 도구 호출을 막는 흐름

판정은 막는 곳에 따라 아래 응답이 됩니다.

판정 내장 도구 (PreToolUse 훅) MCP 도구 (agentgateway ext_authz)
통과 응답하지 않습니다. 엔진은 HTTP 204를 본문 없이 돌려줍니다. 허용
차단 HTTP 200에 훅 출력 형식의 JSON을 담아 돌려줍니다. 거부
묻기 1차 평가에서는 차단과 같습니다. 1차 평가에서는 차단과 같습니다.
판정 없음 훅 명령이 || true로 끝나므로 원래 권한 확인으로 넘어갑니다. 거부 (fail closed)

내장 도구의 HTTP 응답 형식(204, 200)과 훅 명령의 형태는 이번 명세에서 정한 초안입니다.

통과일 때 allow를 보내지 않는 이유는, allow를 보내면 Claude Code의 원래 권한 확인을 건너뛰기 때문입니다.

차단 사유는 Decision Module이 쓴 그대로 전합니다. 사유에는 무엇에 걸렸는지가 아니라, 사용자가 무엇을 하면 되는지가 들어 있습니다.

입력 보내는 곳
판정과 차단 사유 Decision Module
ext_authz 요청 (gRPC) agentgateway. Engine Daemon을 거쳐 들어옵니다.
출력 내용
노드 만들지 않습니다.
간선 만들지 않습니다.
Provenance Record 채우지 않습니다.
훅 응답 내장 도구의 판정을 PreToolUse 훅에 돌려줍니다.
ext_authz 응답 MCP 도구 호출을 허용하거나 거부합니다.

PEP는 Jev에 묻지 않습니다.

  • ext_authz를 MCP의 tools/call에만 걸 수 있는지. 아직 확인하지 못했습니다.
  • agentgateway에서 tool_use_id를 담는 claudecode/toolUseId가 공식으로 약속된 필드인지. 아직 확인하지 못했습니다.
  • MCP 도구 호출에도 PreToolUse 훅이 오는데, 이때 훅에 무엇을 응답할지.
  • 차단 JSON의 어느 필드에 사유를 담을지.
  • 1차 이후 묻기를 사용자에게 어떻게 전할지.