What the agent can do
The tools it can call, and the approval you're asked for before it changes anything.
The agent in the chat is not answering from a description of your project. It reads it, searches it, edits it and runs commands in it — using a fixed set of tools that it must ask for by name, and that Semantix executes on your machine.
Knowing that list is most of knowing what the agent is capable of.
The tools#
Reading and searching — these run without asking you.
| Tool | What it does |
|---|---|
read_file |
Reads one file, optionally just a line range |
read_files |
Reads several files in one call |
list_dir |
Lists what's directly inside a folder — one level, not recursive |
code_search |
Fuzzy, relevance-ranked search across the indexed project |
code_grep |
Exact regex or literal search, with file:line:col and the enclosing symbol |
symbols |
Finds where a function, class or type is defined |
references |
Finds everything that calls or imports a symbol |
check_errors |
Runs your real type-checker — tsc --noEmit, cargo check — and returns the diagnostics |
The last five are the index doing work the model would otherwise pay for with
tokens. code_grep returning the enclosing function for every match is the part no plain search
gives you.
Changing things — these ask first.
| Tool | What it does |
|---|---|
write_file |
Creates or fully replaces one file |
write_files |
Creates up to two files in one call |
edit_file |
Find/replace, insert or delete lines inside an existing file |
create_dirs |
Creates folders |
move_path |
Moves or renames |
copy_path |
Copies, recursively |
delete |
Deletes files or folders |
run_command |
Runs one shell command in a real terminal |
The notebook#
If you turn on Semantic notebook in Settings → Privacy, the agent also gets three memory tools —
notebook_write, notebook_search and notebook_recent — that let it keep notes about your project
across conversations.
Note
The notebook stores what it writes off your machine. That's why it's opt-in, why it's suppressed entirely while Local only is on, and why Semantix refuses notebook calls locally when it's off, even if a model tries one anyway. These tools are not covered by the permission gate below.
Which lane you're on#
This matters more than anything else on the page, so it gets its own section.
On a custom OpenAI-compatible model, Semantix executes the tools above itself. That's the path the permission gate and the automatic checkpoint live on.
On a Claude Code model — the default — the Claude Agent SDK runs its own tools (Read, Write,
Edit, Bash and the rest) plus the Semantix search and notebook tools, and Semantix renders what
it did rather than executing it.
Note
On the Claude Code lane there is no permission prompt and no automatic checkpoint. The agent writes, edits, deletes and runs shell commands without asking, and no rollback point is taken, so the Restore control won't appear on those messages either.
The reasoning is that Claude Code is your own local install running under your own login and settings — Semantix isn't adding access you didn't already have. Routing that lane through the same gate is a known open job, not a decision that it shouldn't be gated. Until then, everything below describes custom-model conversations.
Asking permission#
Before the agent runs anything in the second table, the conversation stops and asks. The whole transcript frosts over and an approval card pins itself to the bottom of the panel so you can't scroll past it.
The card shows Permission required, a class badge — WRITE in amber, DELETE in red, SHELL in
violet — and the tool name. Below that, one line describing the target: $ npm run build for a
command, or the path for a file operation. A move or a copy currently falls through to a compact JSON
summary rather than a tidy source → destination line; the information is there, it's just raw.
Three buttons: Once, For session, and Deny.
Once runs it and asks again next time. Deny refuses; the agent is told plainly that you declined and instructed not to retry, so the turn ends cleanly instead of hanging or nagging.
For session is the one to understand properly:
Note
"For session" approves the whole class, not the tool. Allowing one edit_file for the session
also allows write_file, write_files, create_dirs, move_path and copy_path in that
conversation — every WRITE-class tool — with no further prompts. Shell and delete are separate
classes and still ask.
Grants live in memory only. They're forgotten when you reload Semantix, and they never cross from one conversation to another. There's no saved allowlist and no "reset permissions" control.
Two more things worth knowing. The card shows paths, never content — approving a write_files
means approving the destinations sight-unseen; read the diff afterwards.
Note
Stopping the run while a prompt is open cancels the tool, but the card stays on screen with its buttons live and the transcript stays frosted until you click one of them. Clicking it then changes nothing — the run is already gone. Reloading settles it as a denial.
The undo point#
The first approved change in a turn triggers an automatic workspace checkpoint, labelled
before write_file or similar. That's what the restore control on a message rolls back to — see
Conversations and history.
It's best-effort. If taking the checkpoint fails, the tool still runs; you lose the undo point, not the work.
Watching a tool run#
Each call renders as a card in the transcript: an icon, a friendly name, and the filename it's working on — clickable, it opens that file in a tab. The icon pulses amber while the tool is running and stops when it settles. A failure isn't a red pulse; it shows as a red accent along the card's edge.
The card appears before the arguments finish arriving, and fills in as they stream. A file write
shows a live progress bar counting lines against the model's own estimate, then resolves into a
syntax-highlighted diff. An edit shows +added / -removed before it lands. Deletes, moves and copies
resolve into a list of paths, each marked ok or failed.
Note
A two-file write_files batch shows the paths, not a diff. A single-file write shows the full
diff. If you want to review a batch, click the paths open.
run_command is a real terminal. While it runs, an xterm session is embedded in the chat showing
live output, with a Stop button that kills the child process. You can click into it and type — if
a command asks a question, that terminal is where you answer it. Detected URLs are clickable.
Note
When the command finishes, the terminal disappears and the card collapses to one line —
$ npm test with ✓ exit 0 · 1.4 s. The output is gone from the interface. The agent still has
it; you can't scroll back to it, and there's no copy button on tool cards.
Commands run in the background#
run_command can be told to run in the background. It returns immediately, the turn ends, and the
job keeps going on its own.
It reports back on whichever comes first: the process exits, or its output goes quiet for 4 seconds. That second condition is what lets a dev server say "I'm up" instead of hanging the conversation forever. The report arrives as a new message in the conversation, carrying the last 8000 characters of output.
Note
That report starts a new agent turn — the model reads it and responds, which costs tokens. It will do that even if you stopped the conversation in the meantime, because there's no way to cancel a background job.
Note
A job that reports back because it went quiet is still running, and will not report again. A dev server that crashes ten minutes later says nothing. There's no list of background jobs and no way to stop one; they end when Semantix closes.
MCP servers#
Settings → MCP Servers adds tool servers — remote HTTP/SSE endpoints or local stdio commands.
Their tools are offered to every model, namespaced mcp__<server>__<tool>, and the catalogue is
re-read on every message you send, so changes apply without a restart.
MCP tools execute on your machine, in Semantix's own MCP host. What reaches the model provider is the tool's name, description, schema, and the arguments a call uses.
Note
MCP tools are not covered by the permission gate. Whatever an MCP server exposes — including writing files or running commands — runs without asking you. Add servers you trust, and read what they can do before you enable them.
If the MCP host doesn't answer within 5 seconds, your message is sent anyway with no MCP tools attached, and nothing tells you it happened.
The limits#
| Shell commands allowed | git, node, npm, npx, pnpm, yarn, cargo, rustc, python, python3, pip, pip3, tsc |
Pipes, &&, ;, globs |
Not supported — each step is a separate call |
| Working directory | Must stay inside the project |
| Command timeout | 60 seconds default, 600 maximum |
| Output returned to the model | 64KB, then truncated |
| Terminal scrollback | 2000 lines |
write_files per call |
2 files, stopping at the first failure |
read_file default |
2000 lines |
list_dir |
One level, truncated past 500 entries |
code_grep / code_search |
50 results default (200 max) / 20 (50 max) |
Tools need an open project. With no project open the agent is told
No active project — open a project before running tools.
Note
The shell allowlist is by bare command name. There is no way to add to it from Settings — it's fixed in the build.