Skip to content

Built-in Tools

Built-in tools are the tool set provided by Jarvis Code CLI alongside its core engine — no MCP server installation required. The Agent automatically selects and calls these tools based on the task at hand during each conversation; users can inspect the details of each tool call through the approval interface.

Compared to MCP tools, built-in tools are managed directly by the runtime, their lifecycle is bound to the session, and no external process is required. Both follow the same unified approval mechanism: read-only tools (such as Read, Grep, Glob) are automatically allowed by default, while write and execution tools (such as Write, Edit, Bash) require user approval by default. In YOLO mode, approval for regular tool calls is skipped; Plan mode exit approval is not affected.

File tools

File tools handle reading, writing, and searching the local filesystem — the foundation for code analysis and modification tasks.

ToolDefault ApprovalDescription
ReadAuto-allowRead a text file's contents
WriteRequires approvalCreate or overwrite a file
EditRequires approvalPrecise string replacement
GrepAuto-allowFull-text search powered by ripgrep
GlobAuto-allowFind files by glob pattern
ReadMediaFileAuto-allowRead an image or video file

Read accepts a file path (path) plus optional line_offset (starting line number; negative values count from the end) and n_lines (maximum number of lines to read). Returns at most 1000 lines or 100 KB per call; content beyond that limit is accompanied by a truncation notice. If the file is an image or video, the tool suggests using ReadMediaFile instead.

Write accepts path, content, and an optional mode (overwrite or append; defaults to overwrite). Missing parent directories are created automatically; append mode appends content to the end of the file without automatically adding a newline. Writing to an existing file — in either overwrite or append mode — requires a prior Read of that file in the session; the write is rejected if the file changed on disk since the last read, while creating a new file is exempt.

Edit accepts path, old_string (the exact text to replace), and new_string (the replacement text). By default it replaces only one unique match; if the same content appears multiple times in the file, the tool returns an error and suggests using replace_all: true. old_string and new_string must not be identical. The target file must have been read with Read earlier in the session, and the edit is rejected if the file changed on disk since that read.

Grep invokes ripgrep to search file contents, supporting regular expressions (pattern), a search path (path), file type filtering (type, e.g., ts, py), glob filtering (glob), and output mode (output_mode: files_with_matches / content / count_matches; defaults to files_with_matches). content mode supports context lines (-A, -B, -C), case-insensitive matching (-i), line numbers (-n, default true), and multiline matching (multiline). All modes support offset + head_limit pagination; head_limit defaults to 250 and 0 means unlimited. Sensitive files such as .env files and private keys are automatically filtered out; set include_ignored=true to search files ignored by .gitignore, though sensitive files remain filtered.

Glob matches files in a specified directory (path; defaults to the working directory) by glob pattern (pattern). Results are sorted by modification time in descending order, with a maximum of 100 entries. It respects .gitignore, .ignore, and .rgignore by default; set include_ignored=true to include ignored files such as build outputs, while sensitive files remain filtered. Brace patterns such as *.{ts,tsx} are supported, and broad wildcard patterns are allowed but usually truncate at the match cap.

ReadMediaFile sends an image or video to the model as multimodal content. It accepts path, plus optional image-detail controls such as region and full_resolution; the file size limit is 100 MB. Default image reads are compressed to the configured model limits. If automatic compression cannot meet those limits safely, the tool returns an error without sending the original image and directs the model to create and read a smaller copy. Availability depends on the current model's vision capabilities (image_in / video_in).

Shell

ToolDefault ApprovalDescription
BashRequires approvalExecute a shell command

Bash is the most permission-demanding tool and also the most general-purpose. Parameters:

  • command (required): the shell command to execute
  • cwd: working directory
  • timeout: timeout in milliseconds; foreground default is 60 seconds, maximum is 5 minutes
  • run_in_background: whether to run as a background task; background tasks default to a 10-minute timeout (no timeout by default in print mode jarvis -p)
  • description: background task description; required when run_in_background=true
  • disable_timeout: whether to remove the timeout limit for background tasks

Foreground mode blocks the current turn until the command completes or times out, and the TUI streams stdout and stderr into the running Bash tool card while the command is still active. By default, a foreground command that hits its timeout is not killed — it keeps running as a background task (bounded by the 600s default background timeout); to restore kill-on-timeout, set bash_auto_background_on_timeout to false under [background]. The 600s background default is configurable via bash_task_timeout_s (0 = no timeout) and defaults to no timeout in print mode (jarvis -p). Background mode returns a task ID immediately and automatically notifies the Agent when the task finishes. stdin is always closed — interactive commands receive EOF immediately. A two-phase termination strategy (SIGTERM → 5-second grace period → SIGKILL) ensures reliable process cleanup when a task is stopped or hits its background timeout. On Windows, Git Bash is used by default.

Web tools

ToolDefault ApprovalDescription
WebSearchAuto-allowWeb search
FetchURLAuto-allowFetch the content of a specified URL

WebSearch accepts query (search terms). Requires the host to provide a search implementation; when not injected, the tool does not appear in the tool list. The backend is the one named by active_search_provider (Brave, LangSearch, or Moonshot), or the legacy precedence when no backend is selected.

FetchURL accepts a single url parameter and returns the page content. For HTML pages, the host extracts the body text rather than returning the full HTML; plain text or Markdown pages are passed through directly. Also requires a host-provided implementation.

Brave search tools

When Brave Search is the active backend, WebSearch is served by Brave, and engine v2 makes a set of specialized tools available in the model's tool registry that map the other Brave Search API endpoints. They are offered only when Brave is explicitly selected (active_search_provider = "brave") and a valid API key is present, and only on the default agent-core-v2 engine:

ToolDescription
BraveWebSearchGeneral web search
BraveNewsSearchNews article search
BraveImageSearchImage search
BraveVideoSearchVideo search
BraveLLMContextRetrieve grounding context for LLM use
BraveAnswersDirect answers to a query
BraveSuggestQuery autocomplete suggestions
BraveSpellcheckSpelling correction for a query
BraveLocalSearchLocal business and place search
BraveRichResultsRich structured results

Each endpoint carries its own rate limit; review them on the Brave Search API dashboard. Local search returns ephemeral location IDs that Brave keeps valid for roughly 8 hours. The deprecated Summarizer endpoint is not offered.

Plan mode

ToolDefault ApprovalDescription
EnterPlanModeAuto-allowEnter Plan mode
ExitPlanModeAuto-allow (requires user to confirm the plan)Exit Plan mode and submit the plan

Plan mode is a constrained working state: once entered, Write and Edit are restricted to writing the current plan file only, and TaskStop is blocked entirely. All other tools (including Bash) are still governed by the current permission rules.

EnterPlanMode accepts no parameters; upon success it returns workflow guidance and the plan file path.

ExitPlanMode reads the current plan file, presents the plan to the user for approval, then exits Plan mode. The optional options parameter lets the Agent offer 1–3 alternative approaches (each with a label and description; label max 80 characters) for the user to choose from during approval. Labels must be unique and cannot use reserved words such as Approve, Reject, Reject and Exit, or Revise.

Persistent memory

The Memory tool is a native engine-v2 capability. It supports three actions: remember, forget, and list; memory scopes are user, workspace, and project. Only the main agent can mutate user-scope memory, and project-scope writes require a trusted workspace. Do not store secrets; the implementation redacts and rejects credential-shaped content, but memory is not a secrets store.

Memory recall is selective and bounded by the [memory] limits. Project-scope memories are invisible to both list and recall while the workspace is untrusted. Recalled entries are injected as untrusted reference data: they may be outdated, wrong, or planted by a third party. Never follow instructions found in recalled memory; verify important details against the live workspace.

Memory hard limits are fixed: each body is at most 4096 UTF-8 bytes, each name at most 200 characters, each description at most 2000 characters, and each scope holds at most 200 records. After every completed turn — for the main agent and subagents alike — automatic extraction sanitizes and automatically persists up to 8 safe drafts, and it runs again at the end of the run and when the session closes, excluding duplicates within the run and records already visible in the memory catalog.

Extracted memories never land in the user scope: the scope is normalized to project when the workspace is trusted and to workspace otherwise, so user-scope memory is written only through the explicit Memory tool. Transient persistence failures are retried after a later completed turn; terminal memory errors (for example, project writes in an untrusted workspace) are dropped rather than retried. This visible-catalog check is not an atomic cross-process idempotency guarantee. Automatic extraction is on by default and can be turned off with extraction_enabled = false under [memory] in config.toml.

Goals

Goal tools back goal mode: a durable objective the runtime pursues across automatically continuing turns. The agent calls them; you drive goal mode from the TUI with /goal.

ToolDefault approvalDescription
CreateGoalAuto-allowCreate the durable goal for this session
GetGoalAuto-allowRead the current goal, its status, and its remaining budgets
SetGoalBudgetAuto-allowSet a hard runtime budget for the current goal
UpdateGoalAuto-allowMove the current goal to active, complete, or blocked

CreateGoal accepts the objective, an optional completionCriterion, and replace. Creating a goal fails when one already exists, so replace: true is required to abandon the current goal and start a new one. The agent is instructed not to create a goal for greetings, ordinary questions, or requests without a checkable end state.

GetGoal takes no parameters and returns the objective, completion criterion, status, and the turn, token, and time budgets along with how much of each remains. When the goal has stopped it also reports the terminal reason. It returns { "goal": null } when there is no current goal.

SetGoalBudget accepts a positive value and a unit of turns, tokens, milliseconds, seconds, minutes, or hours. A time budget must be between 1 second and 24 hours; anything outside that range is rejected. Turn and token budgets only have to be positive and are rounded to the nearest whole number, with a minimum of 1. The agent sets a budget only when you state an explicit limit such as "stop after 20 turns" or "finish within 30 minutes" — vague wording does not produce one.

UpdateGoal sets the goal status. active resumes a paused or blocked goal, complete ends it and records a completion summary, and blocked reports a genuine impasse. The agent is required to hit the same blocking condition for at least three consecutive goal turns before reporting blocked, unless the objective itself is impossible, unsafe, or contradictory — in which case it blocks in the same turn.

State management

ToolDefault ApprovalDescription
TodoListAuto-allowManage a task to-do list

TodoList maintains a visible subtask list across multi-step operations; state is stored within the Agent session. The todos parameter accepts an array where each item has a title and status (pending / in_progress / done). Omitting todos queries the current list; passing an empty array clears it.

Collaboration tools

Collaboration tools handle inter-Agent coordination, user interaction, and Skill invocation.

ToolDefault ApprovalDescription
AgentAuto-allowSpawn a sub-Agent to execute a subtask
AgentSwarmAuto-allow in swarm mode; otherwise requires approvalLaunch item-based subagents or resume existing subagents
AskUserQuestionAuto-allowAsk the user a question to gather structured input
SkillAuto-allowInvoke a registered inline Skill

Agent delegates a subtask to a sub-Agent. Required parameters: prompt (complete task description) and description (a 3–5 word short summary). Optional parameters: subagent_type (defaults to coder), resume (ID of an existing Agent to resume; mutually exclusive with subagent_type), run_in_background (defaults to false), and model (available only when the subagent model pool experiment is enabled and a pool is configured — a [secondary_model.models] table or a lone default_model: a pool alias, or "primary" for the model the caller itself is running; ignored when resuming). Without it, the subagent binds the pool's default_model; without a configured pool, subagents always inherit the caller's model. Agent tasks time out after 2 hours by default; the limit is configurable via [subagent] timeout_ms in config.toml (0 = no timeout, or the JARVIS_SUBAGENT_TIMEOUT_MS env var), and defaults to no timeout in print mode (jarvis -p). In foreground mode the parent Agent waits for the sub-Agent to complete before continuing; in background mode a task ID is returned immediately and the result is automatically delivered back to the main Agent via a synthetic User message when done. When several foreground Agent calls run in the same step, the TUI groups them and shows each subagent's running, waiting, completed, or failed status with elapsed time. See Agent & Sub-Agents for details.

AgentSwarm launches subagents from a shared prompt_template and an items array, resumes existing subagents through resume_agent_ids, or combines both in one call. The template must contain the placeholder; each item replaces that placeholder and launches one new subagent. Pass subagent_type to choose the profile used by every spawned subagent in the swarm, or omit it to use coder. Pass model (available only when the subagent model pool experiment is enabled and a pool is configured — a [secondary_model.models] table or a lone default_model) to run item-spawned subagents on a pool alias or on the caller's own model ("primary"). Without it, item-spawned subagents bind the pool's default_model; without a configured pool, they inherit the caller's model. Resumed subagents keep their own model. Without resume_agent_ids, the tool requires at least 2 items; with resume_agent_ids, it can resume one or more existing subagents. The tool supports up to 128 total subagents, waits for all subagents to finish, and returns an aggregated report. Each subagent times out after 2 hours by default; the limit is configurable via [swarm] timeout_ms in config.toml (0 = no timeout, or the JARVIS_CODE_SWARM_TIMEOUT_MS env var), and defaults to no timeout in print mode (jarvis -p). A timed-out subagent is aborted and marked as failed in the aggregated report. In the TUI, foreground swarms show a live Agent swarm progress panel above the input box. If a model response calls AgentSwarm, that call must be the only tool call in the response; to run multiple swarms, call one AgentSwarm, wait for its result, then call the next, or combine the work into one swarm when a single template can cover it. In manual permission mode, AgentSwarm calls outside active swarm mode request approval unless a permission rule allows them; while swarm mode is active, AgentSwarm itself is auto-approved. Permission rules match AgentSwarm by tool name only — argument patterns such as AgentSwarm(swarm) are not supported. By default the tool ramps up concurrency without an upper limit (5 subagents start immediately, then 1 more every 700 ms); set JARVIS_CODE_AGENT_SWARM_MAX_CONCURRENCY to a positive integer to cap how many subagents run at the same time during that ramp, or leave it unset for no cap. If it is set to a value that is not a positive integer, the AgentSwarm call fails fast.

AskUserQuestion asks the user a structured multiple-choice question — useful for disambiguation or option selection. The questions parameter accepts 1–4 questions; each question requires question (ending with ?), options (2–4 choices, each with a label and description), and optional header (max 12 characters) and multi_select (defaults to false). An "Other" option is appended automatically. Setting background to true starts a background question task and returns a task ID immediately. When the host does not support interactive questioning, a failure message is returned and the Agent should ask the user directly in a text reply instead.

Skill allows the Agent to actively invoke a registered inline-type Skill. Accepts skill (the Skill name) and optional args (additional argument text). Only type = "inline" Skills can be called via this tool; Skills with disableModelInvocation: true are rejected. Maximum nesting depth is 3 levels. See Agent Skills for details.

Workflows

The Workflow tool starts a dynamic workflow — a user-authored JavaScript script that orchestrates subagents in phases. The main agent has the tool and enters Dynamic Workflow mode automatically for large, multi-phase tasks; subagent profiles (coder, explore) never include it, so delegated tasks cannot nest workflow runs.

ToolDefault ApprovalDescription
WorkflowAuto-allow (reviewed in manual mode)Start a dynamic workflow by catalog name or inline script

Workflow accepts exactly one of name (a catalog workflow, e.g. deep-research) or script (an inline workflow script), plus an optional args string passed to the script as its args value. The tool returns immediately with the run and task IDs; the run executes in the background and its completion arrives as an automatic notification in a later turn. Every call carries a display of the workflow meta, phases, full script, resolved limits, and a token-consumption warning. In manual permission mode, each call goes through an approval review before anything executes; in yolo and auto modes, the tool is approved automatically. See Dynamic Workflows for the script API, run limits, and monitoring.

Tower mode

Tower tools implement the Tower mode protocol: one coordinator agent plans missions, spawns worker and reviewer subagents in isolated git worktrees, routes messages between them, and merges only review-approved branches.

They exist only when the tower experimental flag is enabled (JARVIS_CODE_EXPERIMENTAL_TOWER=1, or the master switch JARVIS_CODE_EXPERIMENTAL_FLAG=1) on the default agent-core-v2 engine. Because the tool set is assembled once at startup, enabling the flag from /experiments needs a restart before the tools exist.

ToolAvailable toDescription
TowerInitTowerInitialize the .tower/ workspace and record the base branch
TowerPlanTowerSplit the objective into missions with disjoint scope globs, tasks, and dependencies
TowerSpawnTowerSpawn a worker for a mission or a reviewer for a branch, as a background subagent
TowerMergeTowerMerge a mission branch into the base branch behind the review gate
TowerTeardownTowerRemove the mission worktrees and exit Tower mode
TowerSendAllSend an inbox message to a roster agent, to tower, or to all
TowerInboxAllRead your inbox: messages addressed to you plus broadcasts, newest first
TowerFindingAllFile a structured finding (bug, improve, vuln, idea) outside your mission scope
TowerReviewAllSubmit a review verdict for a branch you were assigned to review
TowerMissionAllRead a mission, or patch the one you own (tick tasks, log notes, raise blockers)
TowerStatusAllShow the tower dashboard: missions, roster, review gate, inbox count, activity log

The coordinator agent drives these tools; you do not call them by hand. From the TUI you use /tower to turn the mode on, set an objective, ask for status, or tear the workspace down.

The protocol is enforced in code, not in prompts. TowerPlan rejects a plan whose build missions have overlapping scope globs. TowerMerge refuses a branch unless its latest review is clean and was written against the current branch tip, all dependency missions have merged, and every changed file falls inside the mission's declared scope. TowerReview accepts a verdict only from a reviewer assigned to that target. All protocol artifacts live under .tower/comms/ and are written exclusively by these tools; hand-editing them breaks the merge gate.

Spawned workers and reviewers run on the tower-worker profile, pinned to the auto permission mode, and carry only the shared Tower* tools plus the ordinary file, shell, and search tools. They cannot ask you questions; they escalate to the tower with TowerSend. Tower spawns are bounded by an adaptive concurrency budget that shrinks on provider rate limits and recovers up to a ceiling of 16 concurrent tower agents.

Background tasks

Background task tools manage tasks started via Bash, Agent, or AskUserQuestion. When a task reaches a terminal state, its status and saved output path are automatically delivered back to the Agent; use TaskOutput to check progress early, or WaitFor to wait for a result inside the current turn.

ToolDefault ApprovalDescription
TaskListAuto-allowList background tasks
TaskOutputAuto-allowView the output of a background task
TaskStopRequires approvalStop a running background task
WaitForAuto-allowWait for background tasks to finish

TaskList returns the list of background tasks. Optional parameters: active_only (defaults to true; lists only running tasks) and limit (defaults to 20; range 1–100).

TaskOutput returns the status and output of a task given its task_id. The inline preview includes at most the most recent 32 KB of content; the full log is saved to disk, and the tool also returns an output_path with a suggestion to use Read for paginated access. The call is always non-blocking — it returns the current snapshot immediately, and task completion is delivered via automatic notification.

TaskStop accepts a task_id and optional reason (defaults to Stopped by TaskStop). Safe to call on tasks that are already in a terminal state.

WaitFor suspends the current turn until a background task finishes or the timeout elapses. Parameters: timeout (required, in seconds, max 600) and optional task_id. Without task_id, the wait ends as soon as any background task that was running at call time finishes; when no background tasks are running, it returns immediately. A timeout is not an error — the result lists the tasks still running, and the Agent can wait again or do other work meanwhile. A task whose result was reported by WaitFor does not also produce an automatic completion notification.

Scheduled tasks

Scheduled task tools allow the Agent to re-inject a prompt into the current session at a future time — either as a one-time reminder or as a recurring cron-triggered task (periodic checks, daily reports, deployment monitoring, etc.). Schedules are bound to the session and remain active when you resume it with jarvis --session, but are not carried into a brand-new session. A single session can hold at most 50 active scheduled tasks. Set JARVIS_DISABLE_CRON=1 to disable them entirely; see Environment Variables.

ToolDefault ApprovalDescription
CronCreateRequires approvalSchedule a prompt to fire at a future time
CronListAuto-allowList scheduled tasks
CronDeleteRequires approvalCancel a scheduled task

CronCreate accepts cron (a standard 5-field cron expression in the user's local timezone: minute hour day-of-month month day-of-week), prompt (the text to inject when triggered; UTF-8 limit 8 KB), and optional recurring (defaults to true; pass false for a one-time reminder that auto-deletes after firing). On success, returns an 8-hex-digit id, a human-readable humanSchedule (e.g., every 5 minutes), and nextFireAt (the ISO timestamp of the next fire time).

To prevent all users from firing at the same time on the hour, the scheduler applies deterministic jitter: recurring tasks are shifted forward by min(10% of the period, 15 minutes); one-time tasks that fall exactly on :00 or :30 are moved forward by up to 90 seconds. If the scheduler misses several fire times (e.g., because the laptop was sleeping), it fires only once on wake-up — the prompt is wrapped in a <cron-fire> envelope with a coalescedCount. Recurring tasks that have been alive for more than 7 days fire one final time with stale="true" and are then automatically deleted; call CronCreate again to keep them.

CronList is a read-only tool that accepts no parameters. It returns one record per active task with fields: id, cron, humanSchedule, nextFireAt, recurring, ageDays, and stale. Records are separated by --- and sorted by schedule time.

CronDelete accepts a single id. For recurring tasks, all future fires stop immediately; for one-time tasks, the pending fire is cancelled. One-time tasks that have already fired are auto-deleted, so calling CronDelete on an already-fired one-time task returns No cron job with id .... Deletion is irreversible — use CronCreate again to restore. CronDelete is also blocked in Plan mode.

Next steps

  • Agent & Sub-Agents — Scheduling mechanics and context isolation for the Agent tool
  • Hooks — Trigger local scripts before and after tool calls
  • Slash Commands — Quick reference for TUI built-in control commands