Skip to content

Permissions

The three-layer permission model: every tool call passes through three narrowing gates before it executes. Each layer catches what the others cannot — defense in depth.

flowchart TB
    A([Agent · its tools + mcp_servers]):::ext
    L1[Connection layer<br/>mcp_servers allowlist —<br/>which server classes the agent may reach]:::cls
    L2[Capability layer<br/>tools allowlist — catalog filtered<br/>before the LLM sees it; a hidden tool<br/>cannot be hallucinated]:::cls
    L3[Runtime layer<br/>security-tier gate +<br/>egress/DLP · approval · audit]:::gate
    X([Tool executes in-process,<br/>inside the agent's container]):::ext
    A --> L1
    L1 --> L2
    L2 --> L3
    L3 --> X

    classDef cls fill:#8FA68A,stroke:#2D2D2D,stroke-width:1.5px,color:#1A1A1A
    classDef gate fill:#B87333,stroke:#2D2D2D,stroke-width:2px,color:#FFFFFF
    classDef ext fill:#D5C3B0,stroke:#2D2D2D,stroke-width:1.5px,color:#1A1A1A

The capability layer is the quietly decisive one: because a disallowed tool never appears in the schema, the model cannot call it — whole classes of misbehavior are prevented, not caught after the fact. The runtime layer then gates by tier:

Tier What happens
Standard Executes immediately; basic audit record
Elevated Executes; full arguments + result captured
Restricted Blocks for human approval before executing

Around all three sit the per-run tool_defaults argument layer and the egress/DLP and audit hooks that wrap every execution.

→ §07 — MCP Architecture · §17 — ADR 4 · the live Security Log audit record · tiers per tool in the Tool Reference