Skip to content

Restrict one AI tool or the whole app? Six cases

Restrict one AI tool when a role needs part of an app, and block the whole app when it needs none of it. Six cases, and what new tools do to each rule.

Roopendra Talekar Updated 8 min read
Two restriction rules side by side, one naming a whole connector and one naming three individual tools

When should you restrict one AI tool instead of the whole app?

Restrict one AI tool when a role needs part of an app and not all of it. Block the whole app when the role has no business there, or when the app gains tools faster than anyone reviews them. The question usually arrives with a helpdesk. Support needs to read tickets and post comments, and nobody wants the Support role bulk-deleting saved views.

MCP (Model Context Protocol) is the standard way an AI assistant calls tools in other apps. A restriction in Elaichi decides which connectors and which individual tools a target may reach. It can name a whole connector, meaning one connected app, or individual tools inside it. In Elaichi, restriction targets are role or user only; the organization default is the absence of a rule, which means allow everything. Inside each layer, allow rules add up, block rules add up, and a block always beats an allow.

OWASP's entry on excessive agency in LLM applications lists the two moves as separate mitigations. One limits the extensions an agent may call. The other limits the functions inside each extension. A rule on the whole connector is the first move, and a rule on named tools is the second.

Both serve one principle. NIST SP 800-53 control AC-6, least privilege, allows only the access that users, or processes acting for them, need for their assigned tasks. An AI agent calling tools for a support lead is exactly such a process. The six cases below are about which shape of rule gets there with the least upkeep.

When is blocking the whole app the wrong rule?

When the role has a narrow, legitimate need inside the app. The block removes the need along with the risk, and the work reappears somewhere you cannot see.

The role needs one read out of a broad app. The Xero connector carries well over a hundred tools, and a support agent may need exactly one of them: the status of an invoice. Block Xero for the Support role and the lookup does not stop. It moves to a chat message to finance, or to an invoice PDF pasted into a personal assistant account. Allow that read, or block the writes and deletes, and the lookup stays on the governed path.

Only the destructive part is the problem. Deletes are the part of an app you can list. Elaichi marks deletes with MCP's destructive hint and reads with its read-only hint. A plain write carries no annotation, since neither hint would describe an edit honestly. If your objection to the connector is three delete operations, write three block rules. OWASP's guidance makes the same cut with a mailbox: an extension that summarizes email needs to read it, not to delete or send it. A whole-app block is a far larger claim than the one you meant to make.

Two roles need different slices of the same app. Finance reads billing records in Salesforce. Sales updates contact details in the same Salesforce org. One rule on the whole connector cannot describe both jobs. Restrictions target roles and users, so you write two sets of tool rules, one per role. The alternative is one blunt rule that is wrong for one of the two teams.

The cost of all three is the same. A set of tool rules is a list you now own, and every tool added to that connector later arrives outside it.

When is naming individual tools the wrong rule?

When the list you write today is not the list that will exist next quarter, or when the role should not be in the app at all.

The role has no business in the app. A recruiting system and the Support role is the clean example. A tool-by-tool block list against Ashby has to be complete on the day you write it, and stay complete. One rule on the whole connector is complete by construction. It also reads correctly to an auditor, who sees the intent without rebuilding it from twelve tool names.

The connector's tool list changes. Custom connectors are authored from JSON config, can be forked from a public connector, and can pull upstream changes through a review screen. That screen separates new tools, safe updates, config diffs, conflicts and upstream removals. New tools are a normal result of a pull. A block list written in March does not name the tool that arrives in June, and the absence of a rule means allow. A rule on the whole connector covers the June tool without anyone remembering it exists.

Somebody forked the connector. The connector:create permission is flagged high trust, because a custom connector can be pointed at any destination. A fork's identity includes its declared lineage, walked back to the root. Lineage counts for block rules only, and it fails closed if the chain is broken or circular. So a block on the parent connector also reaches the fork. The host a connector calls is deliberately not part of its identity, so do not plan rules around hostnames.

The cost here is bluntness. A whole-app block generates requests for exceptions. A rule aimed at a member can only narrow what their role allows, and never replaces or loosens a role rule, so a rule on one user cannot be the exception. The person files an access request for the connector, because a request for one tool on a blocked connector is refused. An admin approves it in the console. The grant lifts that connector for that one person only, and every other role rule keeps applying.

How does one intent look as a block list and as an allowlist?

Take one intent: the Support role may read and comment on tickets in Zendesk, and may delete nothing there. Written as a block list, the intent fails open as tools are added. Written as an allowlist, it fails closed.

As a block list, you block the Zendesk delete operations for the Support role. Reads and plain writes stay, and a tool added next quarter is reachable the day it lands.

As an allowlist, you allow the ticket read and comment operations for the Support role. Everything else on that connector is denied, including tools that do not exist yet. In Elaichi, the allowlist stage engages on the presence of an allow rule, not its contents, so an allow rule that names nothing denies everything. That empty rule is the strictest one the system can express, and the one that looks least strict in a console list.

Pick the allowlist when the boundary is narrow and the app is broad, such as a rule that lets a team create tasks in Asana and reach nothing else there. Pick the block list when the role needs most of the app and you are removing a handful of operations.

Why does a block match a tool's name, but an allow only its operation?

Because a name is a label that someone else can edit. A rule is written against a connector and a tool, and Elaichi records the tool's underlying operation from the catalog when the rule is saved. A block then matches the tool name or that operation. An allow matches the operation only.

A tool's advertised name can be changed by whoever edits the connector's documentation, so the name is something the governed party controls. Governance binds the operation, never the label. The MCP schema takes a similar line on the descriptive parts of a tool definition: its annotations are hints, not a guaranteed description of what the tool does. The cases where the difference changes an outcome are in name and operation matching.

What if the tool is fine but the account it points at is not?

Then freeze the argument instead of writing a restriction. Two Notion workspaces, one of which is the board's. One production ledger and one sandbox. The tool is fine, and the target is not.

A toolbox is a saved set of tools, and each entry in it pairs one tool with one connected account. A frozen argument is set on the entry. Elaichi drops a frozen key from the schema it shows the model, then writes the frozen value over the caller's arguments at execution. Passing the key cannot undo it. Entry defaults apply first, the caller's or model's arguments next, and frozen values last.

A restriction decides which tool the agent may call. A frozen argument decides what that call may point at. One condition: a freeze binds only calls made through its toolbox entry, so share the toolbox with the people it governs, not the connection itself. A payment case is worked through in freezing the receiver on a wire transfer.

Which rule fits how much of the app a role needs?

Two questions decide it: how much of the connector the role legitimately needs, and how often the connector's tool list changes.

What the role needs How the tool list behaves Rule to write
Most of the app Stable Block the handful of destructive tools
A narrow slice Stable or changing Allow the operations the role uses; new tools stay out until someone adds them
None of it Either One block on the whole connector, which also reaches its forks
Most of the app Changing Block the destructive tools, then review every upstream pull

The last row is the honest one. Breadth plus churn is a review problem dressed as a permissions problem, and more rules will not change that. NIST's least-privilege control has an enhancement for this case, AC-6(7), which asks for the privileges assigned to roles to be reviewed on a set schedule. Put the connector's pull review on the same schedule.

What happens after you save a rule?

A saved restriction takes effect within about two minutes on every surface: MCP, the console and REST. Role membership changes resolve the same way. Grant revocation is the exception, because the grant is re-read on every call. In Elaichi, removing or suspending a member revokes every live grant in the same transaction as the membership change.

Elaichi applies the rule at every place a member can reach a connector or tool, including listing, connecting, advertising, executing, the final outbound-request check and opening a stored tool file. A restricted tool is withheld from the tool list and cannot be called. Search names it, flagged restricted, with no schema. The MCP specification's tools page allows for that, since the tools a server lists may vary with the authorization on the request. Calling a withheld tool through execute_tool gains nothing either. It is only a naming indirection, and it meets the same gates.

Elaichi writes one entry for each connected-tool call that reaches execution (a call refused earlier writes none). A call for a tool the rule withholds is refused before execution, so it writes no row. What a record holds is the subject of what an AI agent audit log must capture.

When do you not need either rule?

When there is nothing to split. If one team uses one connector, and everyone on it has the same trust and the same job, the role assignment and the audit trail already answer the question. Restrictions divide an app between people who should see different parts of it. With nothing to divide, they add review work and nothing else.

Three roles need no restriction at all. Guest, Auditor and Billing Admin lack tool:execute, which gates the whole endpoint ahead of every scope. For them tools/list is empty, and a call returns an in-band error naming the permission. A connector block written for the free read-only Auditor seat governs nothing that seat could reach.

Before writing a first rule, the case for waiting sets out when none of this is needed yet. For one team set up end to end, see Salesforce access for a sales team. Role design sits under governance, the apps you can write rules for are in the connector catalog of 600+ connectors, and per-team starting points are on the use cases page.

FAQ

Frequently asked questions

Should I restrict one AI tool or block the whole app?

Restrict individual tools when a role needs part of an app, such as reading tickets without deleting them. Block the whole app when the role has no business in it, or when the app gains new tools faster than anyone reviews them. In Elaichi both kinds of rule are written for a role or a user, and a block always beats an allow within each layer.

Does blocking an app also cover tools added to it later?

Yes. A block on the whole connector covers every tool that connector exposes, including tools added after the rule was written, because the rule names the connector rather than a list of tools. A per-tool block list does not. With no rule in place everything is allowed, so a new tool stays reachable until somebody adds it to the list.

What happens if an allow rule names no tools?

It denies everything on that target. In Elaichi, the allowlist stage engages on the presence of an allow rule, not its contents, so an allow rule that names nothing denies everything. That makes it the strictest rule the system can express. It is also the easiest one to write by accident, because an empty list does not look restrictive in a console.

How long does a restriction change take to apply?

In Elaichi it takes about two minutes. Restrictions and role membership are cached for 60 seconds and then spread across the edge, and that holds on MCP, the console and REST alike. Member removal is the exception. In Elaichi, removing or suspending a member revokes every live grant in the same transaction as the membership change, so the removed person's next call fails.

Can one restriction cover everybody in the company?

Not as a single target. In Elaichi, restriction targets are role or user only; the organization default is the absence of a rule, which means allow everything. To cover everyone, write the rule for each role people hold. A rule aimed at a member can only narrow what their role allows, and never replaces or loosens a role rule.

Put agents to work on your own systems

14 days on Gold, no credit card. Start with one app and one team.

Works with
Claude ChatGPT Cursor and any other MCP client, or the Elaichi Agent.
When the trial ends
Nothing is deleted. Connections, roles and the audit log stay where they are, so subscribing picks up exactly where you left off.