Understanding Tool Permissions¶
Sidekick uses an AI agent that can take actions on your behalf — reading decompiled code, renaming functions, running Python scripts, issuing debugger commands. Before you hand the agent broad authority, it helps to understand exactly how those actions are controlled and what you can do to keep the agent inside boundaries you are comfortable with.
This tutorial walks you through the current permissions model, from the moment the agent asks to run a tool, through tag-based rules and per-tool overrides, to the scopes where you can save your preferences.
What happens when a tool needs approval¶
Sidekick is fail-closed: a tool call requires approval unless a policy allows it. Sidekick ships with default application-wide rules that already allow most tool families (see Recommended starting configurations); anything not covered by a rule still asks. For your own chats, rules can come from the current chat, the current workspace, or the application-wide settings. Agents that Sidekick runs in the background on its own do not inherit your workspace or application-wide settings; each has its own rules, which you can change.
When the agent tries to use a tool that is not already allowed, the chat thread pauses and a tool call card appears in the conversation.
The card shows:
- The tool name, its purpose, and its arguments
- An Allow button with a dropdown arrow, and a Reject button with a dropdown arrow
Library-backed chat execution appears here as its own tool call. For example, running a Library
script from chat shows up as library_python_run, which is categorized under library.run (and python.binja.run) and executes Python inside Binary Ninja.
The five actions¶
Clicking the main button performs the default action. Opening the dropdown reveals additional choices.
Allow menu:
| Action | What it does |
|---|---|
| Allow / Allow Once (default) | Approves this single tool call. The next call from the same tool will ask again. The main button is labelled Allow; the first menu item is labelled Allow Once. |
Allow all [tags] tools for this chat |
Approves the tool now and adds every tag shown in the brackets (comma-separated, used for the category-based rules explained below) to the allow list for the current chat only. Matching tools in that chat run without asking; the rule is stored with the chat and does not affect other chats. |
Allow 'tool_name' for this chat |
Approves the tool now and adds this specific tool to the allow list for the current chat only. |
In a background agent's chat (such as Notebook Validation), these two entries read "for Notebook Validation" instead of "for this chat". They add the rule to that agent's own permissions, so it applies to every run of that agent in all workspaces.
Reject menu:
| Action | What it does |
|---|---|
| Reject (default) | Cancels the tool call and returns a rejection message to the agent. |
| Reject with Reason... | Opens a text field so you can explain why you rejected the call. The agent receives your explanation and can adjust its approach. |
Tip
"Allow for this chat" options are a good way to build momentum when you trust the current chat but are not ready to make a workspace-wide or application-wide change.
When approvals are pending only in sub-agent threads, the chat shows a notice with bulk actions as well: approve all pending calls once, reject them all, or allow the currently pending tool types for the rest of that chat.
Edit before approving¶
Next to the Allow and Reject buttons is an Edit button. Clicking it opens the tool call arguments as editable JSON, so you can modify parameters before the tool runs. Click Save to replace the call's arguments with your edits (the arguments must be a valid JSON object). The call stays pending, so click Allow afterwards to run the edited call, or Reject to refuse it. Cancel discards your edits and returns to the original approval prompt.
Opening the Tool Permissions Settings dialog¶
To configure standing rules that apply across sessions, open the dialog from the Binary Ninja menu:
Plugins > Sidekick > Configure Tool Permissions...
Note
This menu item is disabled (greyed out) until the current window has an active Sidekick workspace session (for example, after you open a binary or a project workspace).
The menu item opens the dialog with the This Workspace and All Workspaces scopes. To edit the This Chat scope, open the chat's menu (hamburger button) and choose Tool Permissions...; the dialog opened from there also offers This Chat.
The dialog (titled Tool Permissions Settings) has a Scope selector at the top that controls which level of settings you are editing, followed by a one-line description of the selected scope. Below that are two panes side by side:
- Tags — a tree of tool categories with columns Tag, Tools (how many tools match the tag), Explicit, and Effective
- Tools — the tools matched by the tag selected in the Tags pane (the pane is titled Tools Matching followed by the tag once you select one), with columns Tool, Explicit, and Effective
Each row has an Explicit selector with three radio buttons — Allow, Ask, and Inherit — that edits the rule stored at the selected scope. Effective is a badge showing the final permission for the current context after all scopes are combined.
Tag-based permissions¶
Every Sidekick tool belongs to one or more tags. Tags follow a dot-separated hierarchy. A parent tag can cover an entire family of tools, without you needing to name each tool individually.
The tag hierarchy¶
The dialog lists the tags of the tools available in your environment. The table below shows common examples.
| Tag | Description | Example tools |
|---|---|---|
repo |
All repository operations | — |
repo.read |
Read files | read_repo_file, list_repo_files |
repo.write |
Write or create files | write_repo_file, delete_repo_file |
repo.manage |
Repository management (create, commit) | create_repo, commit_repo |
ui |
All Binary Ninja UI operations | — |
ui.visible |
Read visible content | get_visible_content |
ui.selection |
Read the current selection | get_selection |
ui.navigation |
Open or navigate Binary Ninja UI views | open_project_file |
project |
Binary Ninja project | — |
project.read |
List files in the current project | list_project_files |
notebook |
All Notebook operations | — |
notebook.query |
Query notebook entries | query_notebook |
notebook.update |
Modify notebook entries and analysis context | update_notebook, update_notebook_context |
briefing |
All session briefing operations | — |
briefing.query |
Read the session briefing | get_session_briefing |
briefing.update |
Modify the session briefing | update_session_briefing |
database |
All decompilation database operations | — |
database.query |
Query the binary database | query_database, inspect_type_usage, read_update_report, list_transactions, get_transaction |
database.state |
Analysis status and mapping options | get_analysis_status, get_mapping_options |
database.update |
Modify the binary database | update_database |
index |
All index operations | — |
index.query |
Query indexes | query_indexes |
index.update |
Update indexes | update_index |
library |
All Library item tools | — |
library.search, library.manage |
Search Library items / create Library items | search_library, ensure_library_item |
library.run |
Run Library items and retrieve script outcomes/output | library_python_run, library_agent_run, wait_script, read_script_output |
codemap |
All code map operations | — |
codemap.query |
Query code maps | query_code_maps |
codemap.update |
Update code maps | update_code_map |
python |
All Python tools | — |
python.binja |
Python interpreter running inside Binary Ninja | — |
python.binja.run |
Run Python scripts inside Binary Ninja | library_python_run |
python.binja.eval |
Evaluate Python expressions | python_eval |
python.binja.typecheck |
Static type-check Python (Pyright) | pyright_check |
docs |
Bundled documentation tools | search_docs, read_doc_page |
debugger |
All debugger operations | — |
debugger.control |
Control execution | debug_launch, debug_continue, debug_step |
debugger.inspection |
Inspect state | debug_inspect, debug_modules |
debugger.mutation |
Modify registers or memory | debug_write_register, debug_write_memory |
debugger.backend |
Direct backend commands | debug_backend_command |
debugger.breakpoints |
Manage breakpoints | debug_breakpoint |
source.read |
Read source files | read_source |
terminal |
Run shell commands (asks by default) | run_terminal_command |
mcp |
Tools from configured MCP servers (asks by default) | — |
agent |
Tools for handing work from one agent to another | — |
system |
Sidekick's own housekeeping tools, such as starting and coordinating sub-agents and searching for tools | — |
How tag state works¶
Each scope stores an explicit tri-state for tags and tools:
- Allow: tools matching that rule run without asking
- Ask: tools matching that rule always require approval
- Inherit: no explicit rule at this scope; Sidekick falls through to the next lower-precedence scope
Setting database to Allow stores an explicit Allow for the database tag. Any tool tagged database.query, database.update, or any other sub-tag under database matches that rule unless a more specific tag or tool override says otherwise.
Unlike older versions of the dialog, Sidekick does not expand a parent rule into explicit sibling rules behind the scenes. The UI shows inherited and effective state directly instead.
Note
Tags use prefix matching under the hood. A rule that allows database automatically covers any tool tagged database.query, database.update, or any other sub-tag under database.
Tool-specific overrides¶
The Tools pane lets you pin a single tool to Allow (never ask) or Ask (always ask, even if its tag would otherwise allow it), regardless of what the tag rules say.
Adding an override¶
- In the Tags pane, select a tag that covers the tool. Selecting a parent such as
databaselists all of its tools in the Tools pane. - In the Tools pane, find the tool and set its Explicit radio button to Allow or Ask.
Changes apply immediately. The tool's Effective badge shows the resulting permission.
Removing an override¶
Set the tool's Explicit radio button back to Inherit. The tool reverts to whatever the tag rules say.
When overrides and tags conflict¶
An explicit tool Ask override always beats a tag allow. If database is allowed but you have added update_database as Ask, the agent will still ask before modifying your binary.
An explicit tool Allow override beats a tag set to Ask. If python.binja is set to Ask but you add python_eval as Allow, python_eval runs without asking while library_python_run still does.
The resolution order within any scope is:
- Explicit tool state
- The most specific matching tag state
- No rule at this scope — inherit to the next scope
If no scope allows the tool, the final result is Ask.
A tool can carry several tags. For example, library_python_run is tagged both library.run and python.binja.run. Across all of a tool's tags, the matching rule with the longest tag wins, and if two rules are equally specific, Ask wins. Because python.binja is Allow by default, setting only library.run to Ask at All Workspaces does not stop library_python_run. Also set python.binja (or python.binja.run), or the tool itself, to Ask. Use the Effective column to confirm the result.
Permission scoping¶
The Scope selector at the top of the dialog determines which layer you are reading and writing. Changes in one scope do not affect the others.
| Scope | Label in UI | What it covers | When to use |
|---|---|---|---|
| This Chat | "Applies only to this chat." | The current chat | Grants for one chat only; they are saved with that chat and do not affect other chats. Appears only when the dialog is opened from a chat's Tool Permissions... menu item |
| This Workspace | "Applies only to this workspace." | The current Binary Ninja workspace | Per-binary or per-project rules for your chats |
| All Workspaces | "Applies across all workspaces and updates open user-owned workspaces immediately." | The live application-wide policy for your chats | Global preferences that should apply everywhere immediately |
Note
For your chats, scopes are consulted in order from most specific to least: This Chat, then This Workspace, then All Workspaces. If a tool is set to Ask in "This Chat" but Allow in "This Workspace", the chat-level Ask wins for that session.
Settings saved to This Chat, This Workspace, and All Workspaces are all persisted between sessions. A This Chat rule is stored with that chat, so it lasts as long as the chat does.
Note
Sidekick's built-in background helpers (Notebook Validation and Analysis Briefings) start on their own, so they have their own permissions instead of yours. They do not inherit This Workspace or All Workspaces. Each comes with built-in rules that let it do its job without asking. Anything those rules don't allow asks for approval in that helper's chat. To change a helper's permissions, open Tool Permissions... from its chat menu. The only scope is the helper itself, for example Notebook Validation (All Workspaces). Your changes apply to that helper in every workspace. Set a rule back to Inherit to return to the built-in rule. Specialist agents that a helper or chat delegates to follow the same rules as whatever started them.
The Suggest commands are not background helpers. Each one opens a regular chat that uses your permissions.
Recommended starting configurations¶
Sidekick ships with default application-wide rules, which apply unless you override them in All Workspaces, This Workspace, or This Chat. By default these tag families are Allow: agent, briefing, codemap, database, docs, index, library, notebook, project, python.binja, repo, system, and ui, plus debugger.breakpoints and debugger.inspection. These tags are Ask: debugger (so debugger control, mutation, and backend commands), mcp, and terminal. Any tag with no rule, and any tool with no matching rule at any scope, still asks. The Effective column in the dialog shows the result.
Because most families already allow reads and writes, tightening means explicitly setting tags to Ask. The configurations below are suggested starting points, not presets — you configure them manually in the dialog.
There is no single correct configuration — it depends on what you are doing and how much you trust the current task. Three starting points are described below.
Conservative: approve everything¶
At All Workspaces (or This Workspace), set the tags the defaults allow to Ask: agent, briefing, codemap, database, docs, index, library, notebook, project, python.binja, repo, system, ui, debugger.breakpoints, and debugger.inspection. Every action the agent takes will require your explicit approval unless a more specific rule allows it.
This is appropriate when: - You are working with a sensitive or production binary - You are exploring what the agent does on a new binary for the first time - You want a complete audit trail of every agent action
The tradeoff is friction: multi-step analysis tasks will pause frequently waiting for your input.
Moderate: allow reads, ask before changes¶
Keep the default read tags allowed, and set the write and mutation tags to Ask in This Workspace scope so the rule applies to your chats on this binary:
database.update— renaming functions, adding types, writing commentsnotebook.update— modifying notebook entries and analysis contextindex.updateandcodemap.update— updating indexes and code mapsbriefing.update— modifying the session briefinglibrary.run— launching Library itemspython.binja— direct Python execution inside Binary Ninjarepo.writeandrepo.manage— file and repository changes
The agent can read freely (database.query, ui.visible, ui.selection, notebook.query, docs, index.query, codemap.query) but must ask before making any change.
This configuration suits most day-to-day reverse engineering sessions. The agent can investigate the binary, reason about it, and propose actions, while you review each proposed change.
Liberal: allow most tools¶
The defaults already allow reads and writes. To go further, set these tags to Allow:
debugger.control— lets the agent launch, continue, and step the debuggersource.read— lets the agent read source files
Leave the following requiring approval:
- debugger.mutation and debugger.backend — modifying registers or memory and issuing raw backend commands carry significant risk
- terminal — shell commands can do anything your user account can
- mcp — tools from external MCP servers
If you want direct Python execution (python.binja.run, python.binja.eval) or repository changes (repo.write, repo.manage) to ask, set those tags to Ask, because they are allowed by default.
This configuration suits experienced users working on CTF challenges or personal research where convenience outweighs the risk of unreviewed database edits.
Warning
database.update is allowed by default, so your chats can rename functions and add annotations in every binary you open without asking. To opt in per binary instead, set database.update to Ask at the All Workspaces scope and set it to Allow only in the This Workspace scope of binaries you trust.
Putting it together: a practical example¶
Suppose you are analyzing a malware sample and want the agent to survey the binary, create a Notebook summary, and propose a list of interesting functions — but you do not want it modifying anything yet.
- Open Plugins > Sidekick > Configure Tool Permissions...
- Set scope to This Workspace.
- Set these tags to Ask:
database.update,notebook.update,python.binja,repo.write,repo.manage. - Leave everything else on Inherit.
- Click Close.
Now start a chat and ask Sidekick to survey the binary. The agent can read freely. When it eventually wants to write a Notebook entry summarizing its findings, it will pause and ask you — giving you a chance to review before anything is recorded.
After reviewing its summary and approving the notebook write, you can re-open the dialog and set notebook.update back to Allow (or Inherit) to let future writes go through automatically.
Next steps¶
- Chat Guide — how to direct the agent's analysis in conversation
- Notebook Guide — how Sidekick records findings
- Transaction Log Guide — reviewing what the agent changed
Denying library.run also blocks later wait_script and read_script_output calls, not just new Library launches (unless an explicit tool override allows the call).