The agent's tools differ not by their icon in the interface but by what they give access to. The terminal runs commands in your local environment through the chosen shell profile. Web search brings in external information. The browser drives a page, interacts with elements and captures the state of the screen. A connected MCP server acts in an external system. One chat interface hides four very different planes of access, and risk must be judged by them rather than by how convenient the call is. The most deceptive part here is exactly that uniformity: the approval request looks the same whether the agent is reading a file or submitting a form on your behalf.
The naive model treats every tool as equally harmless since each asks for the same consent. It collapses on specifics. A command in the terminal sees environment variables, the file system and the machine's network. A page in the browser may be authenticated, and an action there has external consequences. A web search result is text written by an outsider. The cost of a mistake differs by orders of magnitude between them: a failed file read costs a few seconds, while a wrong form submission in someone else's system can be irreversible. Different risks call for different limits, not for one blanket permission.
It helps to lay the tools out in a table once: a good scenario for each and what is worth limiting. Below is that map - from the terminal and search to the browser, MCP and image generation. You come back to it when granting rights: it reminds you that the allowed list is written not on the principle of let it work but on the principle of what this task actually needs. The right column is more useful than the left one: a good scenario explains why to switch a tool on, while a limit shows where it stops being harmless.
| Tool | A good scenario | What to limit |
|---|---|---|
| Terminal | Tests, build, status, local diagnostics | Destructive commands, secrets, package scripts, the network |
| Web search | Current documentation and release notes | Untrusted instructions and unverified sources |
| Browser | Visual verification and interaction tests | Accounts, purchases, publishing, sensitive pages |
| MCP |
| A structured action in an external system |
| The list of servers and tools, call arguments |
| Image generation | Mockups and supporting assets | Licenses, branding and where files are saved |
|---|
Browser protection deserves a separate conversation. By default every browser tool requires approval, not only the actions that may have external consequences - and that is not a formality. The reason lies in how the tool is built: the agent reads the page and acts on it through the same mechanism, so the boundary between data and command runs inside a single call. Even in a trusted application, text on a page can try to redirect the agent: an injection through content looks like an ordinary instruction and arrives from a place you do not expect. Before submitting a form or publishing, it pays to check three things: where the action goes, what exactly is being sent and on whose behalf.
Web search calls for the same wariness but for a different reason. It is useful where current documentation or release notes are needed, and harmful when its result is taken as an instruction. Page content is data, not a command; treating it otherwise opens the cheapest channel of influence over the agent's behavior. The marker of a substitution is visible to the eye: the found text starts addressing a performer - do this, run that, open the other - whereas documentation usually describes a system's behavior rather than handing out orders to its reader.
A chain of tools is more dangerous than any single one. The typical scenario looks harmless: the agent looks for the reason a build fails, finds a page discussing a similar error, reads a command there and offers to run it in the terminal. Each step on its own is reasonable, and the outcome is someone else's command executed in an environment that holds keys and repository access. Such a chain is broken only at the boundary between tools: the found text stays a reference, and the decision to execute belongs to a human who sees the whole command rather than a retelling of it.
The main idea fits in one sentence: permissions are not inherited from intent. Telling the agent just look is not the same as forbidding it to change files. Wording sets a direction but is not a technical limit; the limit is set by the run mode, the sandbox, the list of allowed commands, network rules and tool approvals. The check is simple: if lifting a prohibition takes no more than rewriting one phrase in the request, then there is no prohibition, only a wish.
Hence the practical order: first choose the tool for the task, then limit it for the specific scenario, and only then formulate the request. The reverse order - write a nice instruction and hope the agent stays inside it - works right up to the first time page content, command output or an external server's reply suggests something else. The order matters for another reason too: a limit put in place along the way does not undo an action that has already run.
In real work, permissions that are too wide announce themselves through indirect signs, and it pays to know them in advance. The diff touches files the task never mentioned. A network call nobody ordered shows up in the output. The agent reports an action it has taken instead of asking permission for it. The browser ends up on a page where you are signed in, although the task concerned local layout. None of those signs points to a failure of the model: the tool did exactly what it was allowed to do, and the question is who allowed it and when.
The typical failures are predictable. Believing that a phrase in the request limits permissions. Handing terminal output with secrets into the context. Allowing the browser to act on an authenticated page in a mixed-trust task. Taking the text of a found page for an instruction rather than for data. And granting rights once for the whole session without noticing that the task has changed since.