Tools Reference¶
LoopForge exposes a small core toolset, plus a compatibility tool surface (aliases + reserved names) so you can reuse prompts/manifests written for common agent tool conventions.
Tool Index (60+)¶
The table of contents on this page lists section headings, not every tool name. Many tools are grouped under patterns like browser_*, process_*, agent_*, etc.
Use this index when writing prompts/manifests that need exact tool names:
Core¶
fs_read, fs_write, shell, web_fetch, pdf, pdf_extract
Browser¶
browser_navigate, browser_back, browser_scroll, browser_click, browser_type, browser_press_key, browser_wait, browser_wait_for, browser_read_page, browser_run_js, browser_screenshot, browser_close
Compatibility aliases¶
file_read, file_write, file_list, apply_patch, shell_exec, web_search, memory_store, memory_recall
Media¶
image_analyze, image_generate, location_get, media_describe, media_transcribe, speech_to_text, text_to_speech
A2A¶
a2a_discover, a2a_send
Sandbox & processes¶
docker_exec, process_start, process_poll, process_write, process_kill, process_list, canvas_present
Runtime collaboration & scheduling¶
agent_spawn, agent_list, agent_find, agent_send, agent_kill, hand_list, hand_activate, hand_status, hand_deactivate, task_post, task_claim, task_complete, task_list, event_publish, schedule_create, schedule_list, schedule_delete, cron_create, cron_list, cron_cancel, channel_send, workflow_run, knowledge_add_entity, knowledge_add_relation, knowledge_query
How to read this page¶
LoopForge tools fall into two execution boundaries:
| Boundary | Typical use | State behavior | Implemented in |
|---|---|---|---|
| Standalone tools | Files, shell, browser, web, PDF, media, process work | Usually act on the current workspace or one request | rexos-tools |
| Runtime-managed tools | Agents, hands, tasks, schedules, workflows, outbox, knowledge | Persist shared runtime state across sessions | rexos-runtime |
Use the standalone tools when you want to do work in the workspace. Use the runtime-managed tools when you want to create or query durable state inside LoopForge itself.
If you want the bigger picture, read Runtime Architecture after this page.
Running these examples¶
Most examples below are written as:
- a tool call JSON payload (the arguments object), and
- a prompt you can paste into
loopforge agent run.
Quick runner:
fs_read¶
Read a UTF-8 text file relative to the workspace root.
- rejects absolute paths
- rejects
..traversal - rejects symlink escapes
Example¶
Tool call:
Prompt:
fs_write¶
Write a UTF-8 text file relative to the workspace root (creates parent directories).
Same sandboxing rules as fs_read.
Example¶
Tool call:
Prompt:
shell¶
Run a shell command inside the workspace:
- Unix: runs via
bash -c - Windows: runs via PowerShell
LoopForge enforces a timeout and runs with a minimal environment.
Example¶
Tool call:
Prompt:
web_fetch¶
Fetch an HTTP(S) URL and return a small response body.
By default it rejects loopback/private IPs (basic SSRF protection). For local testing you can set allow_private=true.
If truncated=true, LoopForge returns a head+tail snippet with the marker [...] middle omitted [...] and includes both bytes (returned) and total_bytes (original).
Example¶
Tool call:
Prompt:
pdf¶
Extract text from a workspace PDF file (best-effort).
Arguments:
path(required): workspace-relative.pdfpathpages(optional): page selector (1-indexed), e.g."1","1-3","2,4-6"max_pages(optional): default 10, max 50max_chars(optional): default 12000, max 50000
Returns JSON:
pathtext(possibly truncated)truncated(bool)bytes(file size)pages_totalpages(the selector string, or null)pages_extracted
Example¶
Tool call:
Prompt:
See also: PDF Summary case task.
browser_* (CDP)¶
Browser tools enable headless browser automation via Chrome DevTools Protocol (CDP) (no Python by default):
browser_navigate/browser_back/browser_scroll/browser_click/browser_type/browser_press_key/browser_wait/browser_wait_for/browser_read_page/browser_run_js/browser_screenshot/browser_close
Notes:
browser_navigateis SSRF-protected by default (denies loopback/private targets unlessallow_private=true).- Headless by default. To show a GUI window, pass
headless=falsetobrowser_navigate(or setLOOPFORGE_BROWSER_HEADLESS=0as a default). browser_screenshotwrites a PNG to a workspace-relative path (no absolute paths, no.., no symlink escapes).- Default backend is CDP and requires a local Chromium-based browser (Chrome/Chromium/Edge). If LoopForge can’t find it, set
LOOPFORGE_BROWSER_CHROME_PATH. - Optional remote CDP: set
LOOPFORGE_BROWSER_CDP_HTTP(example:http://127.0.0.1:9222). - Optional remote tab mode: set
LOOPFORGE_BROWSER_CDP_TAB_MODE=reuseto skip/json/newand reuse an existing page target (default:new). - Loopback CDP HTTP (
127.0.0.1/localhost) bypasses proxy settings to avoid corporate proxy misconfig breaking local automation. - Optional legacy backend (Playwright bridge): set
LOOPFORGE_BROWSER_BACKEND=playwrightand install Python + Playwright:
browser_wait is a selector-only helper (compat). Prefer browser_wait_for when you need to wait for selector or text.
browser_run_js is useful for extracting structured values (like a specific heading) when selectors are tricky. Use it carefully on untrusted pages.
browser_navigate¶
Starts (or reuses) a browser session and navigates to a URL.
Tool call:
Prompt:
See also: Baidu Weather.
browser_back¶
Go back in history (requires an active session).
Tool call:
Prompt:
browser_scroll¶
Scroll the page (requires an active session).
Tool call:
Prompt:
browser_click¶
Click an element by CSS selector (best-effort fallback: match link/button text).
Tool call:
Prompt:
browser_type¶
Type into an input element (requires an active session).
Tool call:
Prompt:
See also: Baidu Weather.
browser_press_key¶
Send a key press (optionally focus a selector first).
Tool call:
Prompt:
browser_wait¶
Wait for a selector (compat helper).
Tool call:
Prompt:
browser_wait_for¶
Wait for a selector or a text substring.
Tool call:
Prompt:
browser_read_page¶
Extract visible text and basic metadata (title/url).
Tool call:
Prompt:
browser_run_js¶
Run a JavaScript expression and return its value (use carefully).
Tool call:
Prompt:
browser_screenshot¶
Save a PNG screenshot to the workspace (default: .loopforge/browser/screenshot.png).
Tool call:
Prompt:
browser_close¶
Close the browser session (safe to call multiple times).
Tool call:
Prompt:
Compatibility aliases¶
These tool names exist for compatibility and map to LoopForge built-ins:
file_read→fs_readfile_write→fs_writefile_list→ directory listing (workspace-relative;.is allowed)shell_exec→shellapply_patch→ apply*** Begin Patch/*** End Patchpatches (add/update/delete)web_search→ DuckDuckGo HTML search (best-effort; returns a short text list)memory_store/memory_recall→ shared KV store persisted in~/.loopforge/loopforge.db
file_read¶
Tool call:
Prompt:
file_write¶
Tool call:
Prompt:
file_list¶
Tool call:
Prompt:
shell_exec¶
Tool call:
Prompt:
apply_patch¶
Tool call:
Prompt:
web_search¶
Tool call:
Prompt:
memory_store¶
Tool call:
Prompt:
memory_recall¶
Tool call:
Prompt:
image_analyze¶
Analyze an image file in the workspace and return basic metadata as JSON (format, width, height, bytes).
Supported formats: PNG, JPEG, GIF.
Example¶
Tool call:
Prompt:
location_get¶
Return environment metadata as JSON (os, arch, tz, lang).
LoopForge does not perform IP-based geolocation.
Example¶
Tool call:
Prompt:
media_describe¶
Describe a media file in the workspace and return best-effort metadata as JSON (kind, bytes, ext).
Example¶
Tool call:
Prompt:
media_transcribe¶
Transcribe media into text.
For now this tool only supports text transcript files in the workspace (.txt, .md, .srt, .vtt) and returns JSON (text).
Example¶
Tool call:
Prompt:
image_generate¶
Generate an image asset from a prompt.
For now this tool outputs SVG to a workspace-relative path (use a .svg filename).
Example¶
Tool call:
Prompt:
Runtime collaboration and scheduling tools¶
These tools are implemented by the agent runtime (not by the standalone Toolset) and persist state in ~/.loopforge/loopforge.db:
agent_spawn/agent_list/agent_find/agent_send/agent_killhand_list/hand_activate/hand_status/hand_deactivatetask_post/task_claim/task_complete/task_listevent_publishschedule_create/schedule_list/schedule_deletecron_create/cron_list/cron_cancelchannel_send(outbox enqueue; useloopforge channel drainto deliver)knowledge_add_entity/knowledge_add_relation/knowledge_query
Practical differences from standalone tools:
- they usually return JSON records, ids, or workflow state rather than raw workspace output
- they keep state across later sessions instead of acting only on the current prompt
- they are useful for collaboration/orchestration flows, not just one-off file edits
agent_spawn¶
Create an agent session record (persisted) and return its details.
Tool call:
Prompt:
agent_list¶
Tool call:
Prompt:
agent_find¶
Tool call:
Prompt:
agent_send¶
Tool call:
Prompt:
agent_kill¶
Tool call:
Prompt:
task_post¶
Post a task into the shared task board.
Tool call:
Prompt:
task_list¶
Tool call:
Prompt:
task_claim¶
Tool call:
Prompt:
task_complete¶
Tool call:
Prompt:
event_publish¶
Append an event record into the shared event log.
Tool call:
Prompt:
schedule_create¶
Store a schedule record (definition only; execution depends on your runner/daemon setup).
Tool call:
Prompt:
schedule_list¶
Tool call:
Prompt:
schedule_delete¶
Tool call:
Prompt:
cron_create¶
Store a cron job definition (persisted).
If you run loopforge cron worker, LoopForge will execute a small supported subset:
- Schedules:
{ "kind": "every", "every_secs": <seconds> },{ "kind": "at", "at_epoch_seconds": <epoch_seconds> } - Actions:
{ "kind": "system_event", ... },{ "kind": "channel_send", ... }(usesdeliveryas message details)
Tool call:
Prompt:
cron_list¶
Tool call:
Prompt:
cron_cancel¶
Tool call:
Prompt:
knowledge_add_entity¶
Add an entity record to the knowledge store.
Tool call:
Prompt:
knowledge_add_relation¶
Add a relation record (edge) between two entities.
Tool call:
Prompt:
knowledge_query¶
Search entities/relations (best-effort substring query).
Tool call:
Prompt:
channel_send¶
Enqueue an outbound message into the outbox. Delivery happens out-of-band via the dispatcher:
- run once:
loopforge channel drain - long-running:
loopforge channel worker
Supported channels:
console: prints the message on drainwebhook: posts JSON toLOOPFORGE_WEBHOOK_URL
Arguments (tool call JSON):
channel(required):console|webhookrecipient(required): forconsole, use something like"stdout"; forwebhook, this can be a logical name (the URL is configured out-of-band)subject(optional)message(required)
Example¶
Tool call:
Prompt:
workflow_run¶
Run a multi-step workflow and persist execution state to .loopforge/workflows/<workflow_id>.json.
Current scope:
workflow_runis best for orchestrating standalone tools such asfs_write,shell,web_fetch, or browser tools- it does not currently support nesting runtime-managed tools like
task_*,agent_*,knowledge_*,schedule_*,cron_*, orchannel_sendinside workflow steps
Arguments (tool call JSON):
workflow_id(optional): stable id for repeatable runs.name(optional): human-readable workflow name.steps(required): array of step objects.tool(required)arguments(optional object; defaults to{})name(optional)approval_required(optional boolean): force approval gate when approval mode is enabled.continue_on_error(optional): continue after failed steps.
Example¶
Tool call:
Prompt:
hand_*¶
Hands are small, curated “agent templates” that spawn a specialized agent instance.
hand_list: list built-in Hands and whether they are active.hand_activate: activates a Hand and returns{instance_id, agent_id, ...}.hand_status: returns the current active instance (if any) for ahand_id.hand_deactivate: deactivates a Hand instance byinstance_id(kills its underlying agent).
After hand_activate, you can use agent_send to talk to the returned agent_id.
hand_list¶
Tool call:
Prompt:
hand_activate¶
Tool call:
Prompt:
hand_status¶
Tool call:
Prompt:
hand_deactivate¶
Tool call:
Prompt:
a2a_*¶
A2A tools let LoopForge talk to external A2A-compatible agents:
a2a_discover: fetches the agent card at/.well-known/agent.jsona2a_send: sends a JSON-RPCtasks/sendrequest to an A2A endpoint URL
Both are SSRF-protected by default; for local testing you can set allow_private=true.
a2a_discover¶
Fetch an A2A agent card (LoopForge always requests /.well-known/agent.json on the given host).
Tool call:
Prompt:
a2a_send¶
Send a message to an A2A endpoint URL (JSON-RPC tasks/send).
Tool call:
Prompt:
speech_to_text¶
Transcribe media into text.
MVP behavior: supports text transcript files (.txt, .md, .srt, .vtt) and returns JSON with transcript and text.
Example¶
Tool call:
Prompt:
text_to_speech¶
Convert text into an audio file.
MVP behavior: writes a short .wav file to the workspace (placeholder for real TTS).
Example¶
Tool call:
Prompt:
docker_exec¶
Run a command inside a one-shot Docker container with the workspace mounted.
- Disabled by default: set
LOOPFORGE_DOCKER_EXEC_ENABLED=1 - Optional image override:
LOOPFORGE_DOCKER_EXEC_IMAGE(defaultalpine:3.20)
Example¶
Tool call:
Prompt:
process_*¶
Start and interact with long-running processes:
process_start/process_poll/process_write/process_kill/process_list
Processes run with the workspace as the working directory and a minimal environment.
process_poll returns JSON:
stdout/stderr(incremental)stdout_truncated/stderr_truncated(bool; when true, the output contains a head+tail snippet with[...] middle omitted [...])exit_code(null while alive)alive(bool)
process_start¶
Start a long-running process and return a process_id.
Tool call (macOS/Linux example):
Prompt:
process_poll¶
Tool call:
Prompt:
process_write¶
Tool call:
Prompt:
process_list¶
Tool call:
Prompt:
process_kill¶
Tool call:
Prompt:
canvas_present¶
Save sanitized HTML to the workspace (under output/) and return metadata (saved_to, canvas_id, ...).
Scripts, event handlers (e.g. onclick=), and javascript: URLs are rejected.
Example¶
Tool call:
Prompt: