Tool reference

Every tool eVi ships with, grouped by category. Each tool is enabled via tools.<category> = true in ~/.evi/config.toml. Whether the agent can invoke it without prompting depends on auto.auto_approve (see configuration.md).

Add your own tool by decorating a function with @tool(...) and importing the module from evi/apps/cli/main.py + evi/apps/web/server.py — see development.md.

fs — filesystem (default on)

ToolWhat it does
read_fileRead a UTF-8 text file. 256 KB cap for whole-file reads; pass offset (1-based start line) + limit (max lines) to stream a slice of a larger file. Errors string-returned.
write_fileOverwrite or create a file with UTF-8 text. Creates parents.
edit_fileSurgical edit: replace an exact old_string with new_string (once, or replace_all). Preferred over write_file for small changes — cheaper and safer than a full rewrite.
list_dirList entries in a directory, marked D/F per kind.
find_filesGlob by name (e.g. **/*.py). Skips noise dirs (.git, node_modules, .venv, …). One path per line.
search_filesLiteral regex grep over file contents (path:line: text). Narrow with glob (e.g. *.py) + ignore_case. For meaning-based search use find_in_project (the index category).

Safety: 256 KB read cap prevents loading huge blobs into context. There's no implicit traversal check — combine with a hook for that.

code — code execution (default on)

ToolWhat it does
run_pythonRun a Python 3 snippet in a subprocess with a 10s timeout. Combined stdout+stderr, capped at 16 KB. Fresh temp cwd.
monitorWatch for a bounded window (≤300s): kind=file tails NEW lines of a log; kind=command runs a shell command and collects output. Returns early when an until regex matches — for babysitting a build/CI run or tailing a log.

Not a sandbox. Acceptable for trusted local use. For untrusted code, wrap with a Docker hook or disable the category.

memory — long-term memory (default on)

ToolWhat it does
rememberSave markdown under ~/.evi/memory/<name>.md. Overwrites.
recallReturn the full body of a stored memory.
forgetSoft delete — move the file to .attic/. Recoverable.
list_memoriesJSON of [{name, summary}, …] — same data agents see in the system prompt.

The memory index is regenerated on every write/delete and appears in the agent's system prompt automatically. The dreaming engine relies on soft-delete to avoid permanently losing data.

skills — saved instruction packets (default on)

ToolWhat it does
list_skillsJSON of [{name, description}, …].
invoke_skillReturn the full SKILL.md body so the agent can follow it.

Skills live in ~/.evi/skills/<name>/SKILL.md with optional YAML frontmatter (name, description). Example skill in examples/skills/.

image — ComfyUI image generation (default OFF)

ToolWhat it does
generate_imagetext2img via ComfyUI. Submits workflow → polls → fetches → saves to ~/.evi/images/. Returns JSON {prompt_id, seed, paths}.

Requires ComfyUI running at comfy.base_url (default http://localhost:8188). Workflow params: prompt, negative_prompt, width, height, steps, seed, cfg, sampler, scheduler.

subagent — delegated sub-conversations (default OFF)

ToolWhat it does
delegate_exploreSpawn a read-only investigation subagent (fs only).
delegate_planSpawn a planning subagent (no tools; thinks then returns).

Each spawns a fresh Agent with the dream-style scoped tool list, runs to completion, returns the final text + a short trace. Useful for keeping the main conversation focused.

web — web search + fetch (default OFF)

ToolWhat it does
web_searchDuckDuckGo search via ddgs. Returns JSON [{title, url, snippet}, …].
web_fetchDownload a URL (http/https only) and return extracted text. 1 MB raw cap, 16 KB output cap.

Requires pip install 'evi-assistant[web-tools]' (gets ddgs and beautifulsoup4).

voice — TTS + STT (default OFF)

ToolWhat it does
speak_textSpeak text via local TTS (PowerShell SAPI / say / espeak). Returns immediately.
transcribe_microphoneRecord duration seconds and transcribe via faster-whisper.

speak needs no Python deps — uses platform CLIs. transcribe_microphone needs pip install 'evi-assistant[stt]' (faster-whisper + sounddevice + numpy).

computer — mouse / keyboard / screen (default OFF, NEVER auto-approved)

ToolWhat it does
screenshotCapture primary display, save under ~/.evi/screenshots/.
clickMove mouse to (x, y) and click. button ∈ {left, right, middle}.
moveMove mouse to (x, y) without clicking.
type_textType text at the focused element (per-keystroke pause).
keyPress a named key (enter, tab, f5, …).
scrollScroll the wheel. Positive = up.
screen_sizeReturn primary display dimensions as JSON.

Safety:

sqlite — SQLite queries (default OFF)

ToolWhat it does
sqlite_schemaReturn tables + columns for a sqlite file as JSON.
sqlite_queryRun a read-only SELECT (rejects DDL/DML). Returns rows JSON.

pdf — PDF reading (default OFF)

ToolWhat it does
read_pdfExtract text from a PDF. Page-range optional. Caps total output.

Requires pip install 'evi-assistant[pdf]' (PyMuPDF).

mcp — Model Context Protocol (default OFF)

When enabled, ~/.evi/mcp.json is loaded and each MCP server's tools appear in the registry as <server>.<tool>. The catalog is per-installation — see evi mcp list-tools for whatever you've wired up.

transcripts — session logs (default on, no LLM-facing tool)

Background concern, not a callable tool. When tools.transcripts = true, Agent writes every message to ~/.evi/transcripts/<day>/<session>.jsonl. This feeds evi dream and evi sessions list/resume.


Quick safety table

CategoryDefaultIn default auto_approveNotes
fson✅Read/write to anywhere user can access
codeon✅Not sandboxed; subprocess timeout 10s
memoryon✅Soft-delete keeps data recoverable
skillson✅Read-only on shipped skill files
imageoff✅Network: ComfyUI on localhost only
subagentoff❌Spawns more LLM calls
weboff❌Real network
voiceoff❌Records mic / speaks audio
computeroff❌ (never)Drives the desktop
sqliteoff❌DB content may be sensitive
pdfoff❌File reads
mcpoff❌Whatever the MCP server does

Tool search at scale

With many tools enabled (especially several MCP servers), sending every tool schema on every turn bloats the context. Turn on deferred tool search:

[tools]
tool_search = true            # off by default
tool_search_threshold = 30    # only defers once the toolset exceeds this

When active, the fs and memory tools stay loaded and the long tail moves behind a single search_tools meta-tool. The model calls search_tools("git commit") to surface matching tools; they're added to the live toolset and become callable on the next step — still subject to the normal per-category permission gating (search_tools only exposes tools, never runs them). Below the threshold it's a no-op, so it's safe to leave on.

Edit on GitHub ↗