The question looks like a performance argument and is really an evidence argument. Both designs answer "may this caller run this tool right now?" The difference is what backs the answer when someone asks why it was allowed, or why it was not.
In the token-claim design, the permission travels with the caller. The authorization server mints a token carrying a tier (or role, or plan) and the API trusts the signature. This is the classic claim-as-assertion approach: a claim is a trusted statement about a user that an API can rely on without a round trip, and the usual advice is to design scopes and claims together so the claim set matches the API's authorization rules (Curity on claims). The cost is baked in: the token is a snapshot, and the snapshot ages.
In the lookup design, the permission lives in a policy engine or database and is re-read at decision time. An agent framework can consult a policy before every tool dispatch and map the result to allow, deny or requires-approval, with the policy input carrying the tool name, the arguments and even the message history for the run (AI SDK policy tool approvals). This gives you live truth, at the price of a hop on every call.
Subagents sharpen the problem. A spawned worker is a new execution principal, not a copy of its parent, and inheriting the parent's token by default is a privilege carryover that lets a read-only reporting worker hold write scope (Permit on subagent MCP permissions). Whatever you choose, the decision must be attached to the specific child, tool and arguments.



