▞ jazzdocsblogpersonas
github

Tools Reference

This page helps you find the exact name, risk tier, and behavior of a tool.

Every tool an agent can call, generated from the registry. Risk tiers determine what runs unattended — see Tools & approval for the mechanism and Security for the threat model.

This page is verified by a test (bun test packages/core/src/agent/tools/register-tools.docs.test.ts) that fails if the registry and this table drift apart. If you add a tool, update this page.


At a glance

Count
Agent-facing tools46
Hidden execute_* counterparts (the second half of each approval pair)9
Total registered56
read-only25
low-risk12
high-risk7
unknown2

Plus, registered per agent rather than globally:

SourceToolsNotes
Skillsfind_skills, load_skill, load_skill_sectionPresent when the agent has skills available — see Skills loading
MCPmcp_<server>_<tool>Discovered from the agent’s tool list, connected lazily — see MCP
Customwhatever you defineAgent-config customTools — see Configuration

How approval pairs work

Eight tools are gated: calling them does not act. They return a description of the intended action (including a preview diff for edits), and only after approval — from a human or from --approval-policy — does Jazz invoke the hidden execute_* counterpart.

flowchart LR
    M["Model calls<br/><code>write_file</code>"] --> P["Propose:<br/>resolve path, compute diff<br/><b>no mutation</b>"]
    P --> G{"Approved?"}
    G -->|yes| E["<code>execute_write_file</code><br/>actually writes"]
    G -->|no| D["Refusal returned<br/>to the agent"]

    classDef gate fill:#f9a03f,stroke:#b3541e,color:#1a1a1a
    classDef act fill:#4f9d9d,stroke:#2f6d6d,color:#ffffff
    class G gate
    class E act

You never call execute_* names yourself; they are hidden from the model’s tool list.


What each tool reveals

Risk is not the same question as disclosure. Risk asks what a tool can do to the machine; disclosure asks how freely its answer can be shared. The two do not correlate: read_file is read-only and can reveal anything, get_time is read-only and reveals nothing, write_file changes the machine and reveals nothing at all.

Every tool declares both. The field is required, with no default anywhere, so a new tool cannot be added without someone deciding.

LevelSafe to tellTools
publicsafe to tell anyoneadd_reminder, cp, mkdir, mv, rm, web_fetch, web_search, write_file
internalthe shape of this machine — paths, names, what is installedanalyze_media, cancel_batch, cancel_trigger, cd, context_info, create_pdf, create_web_app, find, get_time, list_jobs, list_triggers, ls, pdf_page_count, pwd, register_trigger, search_tools, stat
privateyour own material — file contents, memory, schedule, transcriptask_file_picker, ask_user_question, cancel_reminder, edit_file, enqueue_batch, execute_command, grep, http_request, list_reminders, list_todos, manage_memory, manage_todos, manage_workspace, read_file, read_pdf, retrieve_tool_result, spawn_subagent, summarize_context, update_work_state, view_memory, view_workspace

A tool spanning two levels takes the more sensitive one — edit_file writes, but its approval message carries a diff of your file, so it is private. http_request reaches private networks including services on localhost, so it is too.

Skill tools (find_skills, load_skill, load_skill_section) are internal too, and are absent from the table for the same reason they are absent from the one below: they are registered per agent rather than globally.

There is no unknown level. MCP and custom tools are private, because a tool defined outside this codebase returns something this codebase cannot classify, and the safe reading of “unknown” is the most restrictive one.


The tools

File Management

ToolRiskApproval pairWhat it does
cdread-onlyChange the working directory for this session. Persists across subsequent tool calls.
cphigh-riskexecute_cpCopy a file or directory. Equivalent to shell cp/cp -r. Directories are copied recursively.
edit_filehigh-riskexecute_edit_fileEdit file via replace_lines, replace_pattern, insert, or delete_lines. Applied in order. IMPORTANT: Use rep…
findread-onlyFind files/directories by name, glob, or regex. Also advertised as glob. Searches names/paths, NOT contents (use grep).
grepread-onlySearch file contents for text patterns (ripgrep with grep fallback). Supports regex, file filters, context…
lsread-onlyList directory contents. Supports recursive traversal, name filtering, hidden files. Default 200 results, c…
mkdirhigh-riskexecute_mkdirCreate a directory. Parents created automatically by default.
mvhigh-riskexecute_mvMove or rename a file or directory. Equivalent to shell mv.
pdf_page_countread-onlyGet total page count of a PDF without reading content.
pwdread-onlyPrint the current working directory.
read_fileread-onlyRead a UTF-8 text file with numbered lines. startLine/endLine; negative startLine reads from the end.
read_pdfread-onlyExtract text and tables from a PDF. Use pdf_page_count first for large files. Supports page ranges.
rmhigh-riskexecute_rmRemove a file or directory. May be irreversible.
statread-onlyCheck file/directory existence and get metadata (type, size, times).
write_filehigh-riskexecute_write_fileWrite content to a file, creating it if needed. Replaces entire file content.

Shell Commands

ToolRiskApproval pairWhat it does
execute_commandunknownexecute_execute_commandRun a shell command when no dedicated tool exists. Each command is classified read-only, low-risk, or high-risk, and the active tier then applies to that verdict. Stdout/stderr capped at 256 KB each.

In the interactive terminal, an operator can also type ! <command>. That explicit shell escape uses the same cwd resolution, environment sanitization, denylist, timeout, interruption, and output caps as execute_command, then gives the result to the agent as context. It is not available through jazz run or remote chat surfaces.

ToolRiskApproval pairWhat it does
web_searchread-onlySearch the web for real-time information.

Web Fetch

ToolRiskApproval pairWhat it does
web_fetchread-onlyFetch and extract text content from a URL.

HTTP

ToolRiskApproval pairWhat it does
http_requestread-onlySend HTTP requests. Supports all methods, headers, query params, and body formats.

Todo

ToolRiskApproval pairWhat it does
list_todosread-onlyRead the current todo list. Returns all items with their status and priority.
manage_todoslow-riskCreate or update the todo list. Send the FULL list of items each time (replaces the previous list). Use thi…
update_work_statelow-riskRecord where you are in the current task so it survives compaction and resuming later. Patches o…

Memory

Opt-in per agent (like File Management) rather than always-on — see Memory.

ToolRiskApproval pairWhat it does
view_memoryread-onlyCall first, before answering, at the start of every conversation.
manage_memorylow-riskSave facts about this person that will still matter later — preferences, location, age, how they…

update_work_state lives with the todo tools (always-on). It is scoped to one conversation and discarded when the task ends, unlike memory which persists across conversations — see Context management.

Workspace

Opt-in per agent (like Memory) rather than always-on. Deliberately separate from memory: memory is small, curated, one-file-per-topic notes; workspace is where large working drafts, research dumps, and intermediate artifacts live, referenced from memory rather than duplicated into it.

ToolRiskApproval pairWhat it does
view_workspaceread-onlyView your durable scratch space: working drafts, research dumps, and intermediate artifacts too…
manage_workspacelow-riskSave durable working drafts, research dumps, or intermediate artifacts too large or provisional…

Reminders

Opt-in per agent. Reminders persist on disk and fire later on the same surface that scheduled them — see Reminders.

For CLI-hosted agents, add_reminder installs the same real one-shot host-scheduler job (launchd on macOS, an at job on Linux) used for wake triggers, so a reminder fires even if jazz daemon isn’t running; firing sends a native OS desktop notification instead of resuming a conversation — a reminder is “notify a person,” never “resume the agent.” jazz daemon’s in-process ticker remains a fallback for hosts with neither launchd nor at. Telegram and Discord reminders are unaffected by any of this: their bots already sweep and deliver reminders as chat messages from their own in-process interval, unchanged.

ToolRiskApproval pairWhat it does
add_reminderlow-riskSchedule a reminder from a duration (30m), clock time (18:00), tomorrow HH:MM, a weekday (tue 20:00), or an absolute 2026-08-25 20:00.
list_remindersread-onlyList this person’s pending reminders, including their id, fire time, and text.
cancel_reminderlow-riskCancel a pending reminder by id (get the id from list_reminders first).

Wake Triggers

Opt-in per agent. A trigger causes the agent to actually run again with a given prompt, resuming the exact conversation it was scheduled from — unlike a reminder, which just delivers a note to a person. See Reminders for how the two compare.

register_trigger does not depend on jazz daemon running to actually fire. Registering a trigger installs a real one-shot job with the host’s own scheduler — a launchd job on macOS, an at job on Linux — that fires the trigger by invoking jazz directly at the scheduled time, even if nothing else is running. jazz daemon’s in-process ticker remains a fallback for platforms or environments with neither launchd nor the at binary available (most containers, some CI), and scheduling with the host is always best-effort: if it fails for any reason, registration still succeeds and the ticker is the safety net.

ToolRiskApproval pairWhat it does
register_triggerlow-riskSchedule yourself to wake up later and resume this exact conversation — use this when you need to…
list_triggersread-onlyList this agent’s pending self-scheduled wake triggers.
cancel_triggerlow-riskCancel a pending wake trigger by id (get the id from list_triggers first).

Background Jobs

Opt-in per agent. Runs several independent shell commands in the background with a concurrency cap and per-job retry/backoff, without blocking the agent’s turn. Completion (fan-in) resumes the conversation the same way a wake trigger fires, once every job in the batch reaches a final state, and the agent is told each job’s status and what it printed — a batch exists to find something out, so an exit code on its own would tell it nothing.

If that resumed turn needs an approval nobody is there to give, the run parks instead of dying: you get a desktop notification naming it, and jazz runs resume <id> finishes it. See tools and approval.

ToolRiskApproval pairWhat it does
enqueue_batchunknownexecute_enqueue_batchRun several independent shell commands in the background with a concurrency cap and per-job retry/backoff.
list_jobsread-onlyList this agent’s background job batches, every job’s status, and what each one printed.
cancel_batchlow-riskCancel a job batch’s pending jobs by id (jobs already running finish naturally).

Context

ToolRiskApproval pairWhat it does
context_inforead-onlyGet current context window token usage statistics.
get_timeread-onlyGet current date and time. Use for scheduling, relative times (yesterday, next Monday), and timestamps.
retrieve_tool_resultread-onlyRead a tool body that was offloaded from context. Pass the tool_call_id from the placeholder.
ToolRiskApproval pairWhat it does
search_toolsread-onlyFetch full parameter schemas for deferred tools (MCP servers, background jobs, etc.) you can see by name in your tool list but haven’t fetched yet.

Sub Agents

ToolRiskApproval pairWhat it does
spawn_subagentlow-riskSpawn a sub-agent with fresh context for a specific task. Personas: coder, researcher, default. Optionally validate a bounded JSON handoff with resultSchema; see Sub-agents internals.
summarize_contextread-onlyCompact conversation by summarizing older messages to free token budget. Always performs summarization when…

Perception Delegation

Always-on. Lets a text-only agent borrow eyes, ears, or a watch from a model that has them.

ToolRiskApproval pairWhat it does
analyze_mediahigh-riskexecute_analyze_mediaDelegate image/audio/video analysis to a capable model companion and get the textual answer back. The person at the keyboard picks which model does the looking (picker-style approval, never auto-approved); an agent with a pre-bound companions entry for the role (analyze:image, analyze:audio, analyze:video) routes there silently instead.

User Interaction

ToolRiskApproval pairWhat it does
ask_file_pickerread-onlyShow an interactive file picker for the user to select a file.
ask_user_questionread-onlyAsk the user a question with interactive selectable suggestions. One question per call.

Web App

Opt-in per agent via tools. Used by chat bridges that can render a Mini App or a static image.

ToolRiskApproval pairWhat it does
create_web_applow-riskCreate an interactive UI — a chart, form, dashboard, small game, or any other webpage — for delivery as a static image or a live page.
create_pdflow-riskRender a PDF from HTML the agent writes, saved to the working directory or an explicit path. Text and numbers are exact — a renderer, not an image generator.

What is not a built-in tool

A common and consequential misreading. These capabilities exist, but not as built-in tools — they are skills that shell out through execute_command, which is unknown:

CapabilityHow it actually worksEffective risk tier
Email (read, archive, send)email skill → Himalaya CLI via execute_commandunknown
Calendar (list, create)calendar skill → khal via execute_commandunknown
Obsidian vault writesobsidian skill → CLI via execute_command, or write_fileunknown / high-risk

So a scheduled workflow set to autoApprove: low-risk cannot archive an email — every himalaya invocation is declined. The fix is usually not to raise the whole tier to high-risk (which also unlocks rm and git push), but to allowlist the specific binary:

// ~/.jazz/config.json
{ "autoApprovedCommands": ["himalaya", "khal"] }

That keeps the tier low while letting the one command through. Matching is on a parsed key (binary + first subcommand), never a raw prefix — see Tools & approval.


Notes

  • find vs grepfind locates files by name, glob, or path pattern. grep searches inside file contents. Non-overlapping on purpose.
  • execute_command classifier. The tool is unknown, so a harness-model classifier labels each command read-only, low-risk, or high-risk and the active tier judges that verdict: --approval-policy read-only auto-approves an inspect-only command, an interactive session skips its prompt, yolo skips the classifier entirely. The live zone shows classifying while it runs, and the verdict is printed on the settled receipt. It sees the last five user requests (800 characters) on an interactive session and the command alone everywhere else — never the assistant’s own turns. Timeouts and ambiguous replies stay high-risk. See Tools & approval.
  • http_request is read-only by risk classification even though it can issue POSTs. It reaches whatever URL the agent targets; network policy belongs at the firewall, not the tier. Treat it accordingly on surfaces that accept untrusted input.
  • Timeouts — 3 minutes by default per tool. ask_user_question and ask_file_picker are longRunning and never time out, because waiting for a human is not a hang.
  • Concurrency — up to 10 tools execute in parallel per iteration.
  • create_pdf needs a browser too — same puppeteer-core path as create_web_app’s static mode, rendering through page.pdf(). It writes to the agent’s working directory by default (an explicit path overrides), unlike create_web_app, whose output lands in Jazz’s own data directory because only a bridge ever reads it.
  • create_web_app needs a browser for mode: "static" — it screenshots the page through puppeteer-core, which deliberately ships no bundled Chrome so that installing Jazz never downloads one. It uses PUPPETEER_EXECUTABLE_PATH if set, otherwise an installed Google Chrome; with neither it fails and says so. mode: "interactive" needs no browser.

machine-readable: /docs/reference/tools.md · /llms.txt · /llms-full.txt