Tool Permission Models в 2026: какие права давать агенту на вызов инструментов
Tool permission models в 2026: allow-lists, approval scopes, sticky approvals, hosted MCP restrictions и почему `tool available` не равно `tool allowed`.
Tool permission model в 2026 нужен потому, что "агент видит инструмент" ещё не означает "агенту можно этим инструментом пользоваться". Для production-систем вопрос уже не в том, как подключить больше tools, а в том, какой объём полномочий давать агенту в конкретном run, tenant, route и risk bucket.
Именно здесь начинается реальный control plane вокруг agents: какие tools доступны, какие требуют approval, какие запрещены всегда, какие разрешены только в read-only режиме, а какие можно использовать только после sticky human decision.
Permission model для tools похож на права в корпоративной системе. То, что сотрудник знает о существовании кнопки, не означает, что он может нажать её без ограничений. Для агента логика та же.
Самый опасный anti-pattern - давать агенту весь набор доступных tools по умолчанию и надеяться, что prompt сам ограничит поведение. Без permission model tool layer быстро становится вашей самой широкой и дорогой поверхностью риска.
tool availability и tool permission должны быть разными слоями;
high-risk tools по умолчанию deny;
scoped approvals лучше глобальных allow all;
hosted MCP tools и local function tools могут требовать разных правил.
Без техники
Агент видит search, CRM update, payment action, file delete и publish. Ограничения описаны только словами в system prompt.
С техникой
Инструменты разбиты на read-only, guarded и blocked. Routing и tenant policy решают, какие tools видимы, какие требуют approval, а какие недоступны вообще.
ПромптPermission intuition
Чем отличается `tool is available` от `tool is allowed`?
Ответ модели
Available означает, что tool вообще существует в системе. Allowed означает, что текущему агенту и текущему run-у реально разрешено его вызывать при данных условиях.
Если tool меняет внешний мир, считайте его commit-tool, даже если с точки зрения интерфейса он выглядит безобидно. Именно side effect, а не marketing name, задаёт permission class.
У них разный blast radius и разные approval surfaces. Например, hosted MCP restrictions часто полезно задавать через allowed tools configuration, а local functions удобнее заворачивать в per-call approval logic.
def can_use_tool(route, tenant, tool_name):
if tool_name in {"delete_customer", "git_push"}:
return "deny"
if route == "support_low_risk" and tool_name == "issue_refund":
return "approval_required"
if tenant == "sandbox-demo" and tool_name == "send_external_email":
return "deny"
return "allow"
Практический совет: permission model стоит проверять до того, как tool вообще попадёт в reasoning loop. Чем позже система говорит "это нельзя", тем больше агент уже успевает построить план вокруг запрещённого действия.
Проверьте себя
1. Что означает разница между `tool available` и `tool allowed`?
2. Почему dangerous tools лучше держать deny-by-default?