Skip to main content
This reference lists all available tools organized by category.

Tool Tags

Tools are organized by tags for filtering:

Categories


Planning & Task Management

Tools for creating plans, managing tasks, and tracking progress.

add_dependency

Tags: planning, coding:plan Create a dependency between two tasks in the current plan. DEPENDENCY TYPES:
  • blocks: from_task must complete before to_task can start
  • related: informational link, no execution constraint
  • parallel_with: explicitly marks tasks as parallelizable
EXAMPLES:
  • Task A blocks Task B: add_dependency(from_task=“A-id”, to_task=“B-id”, type=“blocks”) Means B cannot start until A completes.
  • Tasks can run together: add_dependency(from_task=“A-id”, to_task=“B-id”, type=“parallel_with”) Explicitly marks A and B as safe to run in parallel.
  • Informational link: add_dependency(from_task=“A-id”, to_task=“B-id”, type=“related”) No execution constraint, just documents a relationship.
USE WITH list_ready_tasks: After adding ‘blocks’ dependencies, use list_ready_tasks to see which tasks have no unresolved blockers and are ready to work on.

add_task

Tags: planning, coding:plan, coding:default Add a new task to the current plan. This is your primary tool for dynamic planning and sub-planning. WHEN TO USE:
  • When you discover additional work that needs to be done
  • When you encounter missing dependencies or prerequisites
  • When breaking down complex work into more steps
  • When pivoting approach requires new tasks
SUB-PLANNING WITH parent_id:
  • Use parent_id to create subtasks under an existing task when you discover complexity
  • Break down tasks that prove more complex than initially planned
  • Create hierarchical task structures for better organization
  • Each subtask inherits context from parent but can have specialized metadata
COMPLEXITY DISCOVERY PATTERNS:
  • Implementation agent finds task needs research → add subtask with preferred_agent: “research”
  • Research agent discovers multiple integration points → add subtasks for each integration
  • Any agent finds unfamiliar tech/patterns → add subtask with tool_hints: [“search_first”, “use_subagent”]
  • Task requires multiple phases → add sequential subtasks with position ordering
METADATA OPTIONS:
  • preferred_agent: Which agent should handle this (planning/research/implementation/debugging/tdd/finalize)
  • tool_hints: Suggested tools to use [“use_bash”, “use_subagent”, “search_first”, “test_first”]
  • dependencies: What this task depends on (packages, files, other tasks)
  • notes: Important context or discoveries
  • priority: high/medium/low
SUB-PLANNING EXAMPLES:
  1. Complex Implementation Discovery: parent_id: “task_123”, title: “Research authentication patterns”, preferred_agent: “research”, notes: “Found unfamiliar OAuth flow”
  2. Multi-Step Breakdown: parent_id: “task_456”, title: “Setup database schema”, position: 1 parent_id: “task_456”, title: “Create migration scripts”, position: 2
  3. Cross-Agent Coordination: parent_id: “task_789”, title: “Write integration tests”, preferred_agent: “tdd”, dependencies: [“API endpoints complete”]
BEST PRACTICES:
  • Add tasks as soon as you discover they’re needed
  • Use parent_id when expanding existing tasks that prove complex
  • Include metadata hints for better execution
  • Position subtasks logically in sequence
  • Use descriptive titles and comprehensive descriptions
  • Create subtasks for different agent specializations when needed

create_plan

Tags: planning, coding:plan, coding:default Create a comprehensive plan with tasks for implementing a feature or solving a problem. WHEN TO USE:
  • AFTER you preform your initial research and analyze the problem.
  • Use this tool when you need to organize complex work into structured steps
  • You typically should create plans AFTER your findings. Avoid creating tasks to research, explore, identify, or search through the codebase. You should first perform your research so you can create an informed plan.
  • ESPECIALLY when you are going to delegate. If you are about to spawn sub-agents, plan first: the task graph is what tells you which of them can run at the same time. An orchestrator that spawns without a plan has no record of what is independent, and ends up delegating one agent at a time.
VISIBILITY: Sub-agents you spawn CAN read this plan. A spawned thread with no plan of its own resolves list_tasks / get_plan / list_ready_tasks against its nearest ancestor’s plan, so the board you build here is the board they see. They can update the status of a task you assigned them; only this thread can change the plan’s shape (add tasks, edit the plan itself). So a plan is how you delegate, not just how you take notes. Tasks are the units of work you hand out — write them at the size of one sub-agent’s job. PLAN STRUCTURE:
  • Title: Clear, concise title for the plan
  • Description: Detailed description including:
    • Main objective
    • Approach/strategy
    • Alternative approaches (if applicable)
    • Success criteria
  • Complexity: simple|moderate|complex
  • Tasks: List of tasks with title, description, optional metadata, and optional dependencies
  • The plan will be associated with the current session
INLINE DEPENDENCIES: You can specify dependencies between tasks at creation time using 1-indexed task positions. Each task can have a “dependencies” array where each entry specifies:
  • task_position: The 1-indexed position of another task in the tasks array
  • type: “blocks” (the other task must COMPLETE first — a real data dependency), “related” (informational only), or “parallel_with” (emphasis that two tasks are safe together; rarely needed, since anything without a “blocks” edge already is)
The dependency means: “the task at task_position has this relationship TO the current task.” For example, if task 3 has dependencies: [{task_position: 1, type: "blocks"}], it means task 1 blocks task 3. INDEPENDENT IS THE DEFAULT. Tasks with no “blocks” edge between them can run at the same time — you do NOT need to mark that. Add “blocks” only where a real data dependency exists: task B consumes something task A creates. Name it in the task description when you do. A chain of “blocks” edges says every task must wait for the previous one, which serializes the whole plan. Only write one when that is true. Example — fan-out (the common shape; four independent tasks, then a join):
Example — a genuine chain (each step consumes the last):
TASK METADATA: Each task can optionally include metadata with agent hints:
  • preferred_agent: Which agent should handle this task
  • tool_hints: Suggested tools to use
  • dependencies: Informational dependency notes (free-form text)
  • notes: Important context
  • priority: high/medium/low
BEST PRACTICES:
  • Break down work into clear, actionable tasks
  • Cut tasks along boundaries that do not overlap (package, module, directory), so independent tasks can be worked at the same time without collisions
  • Use inline dependencies to define the task graph upfront, and add “blocks” ONLY where one task genuinely consumes another’s output
  • Include a mini-roadmap in the description
  • Document alternative approaches for pivoting
  • Be specific about what needs to be done
  • Consider edge cases and potential blockers
  • Consider changing state in parallel with plan creation, if states are available.

create_subtask

Tags: planning, coding:plan Create a subtask under an existing task. WHEN TO USE:
  • When breaking down a complex task into smaller steps
  • To add more granular tracking
  • When discovering additional work while implementing
BEST PRACTICES:
  • Keep subtasks focused and specific
  • Use subtasks for logical groupings of work
  • Don’t create too many levels of nesting

get_plan

Tags: planning, readonly, coding:plan Retrieve the current plan for this session. WHEN TO USE:
  • When you need to review the current plan
  • To check plan status and progress
  • To understand what needs to be done
RETURNS:
  • Plan details including title, description, status, and complexity
  • Returns error if no plan exists for the session

list_ready_tasks

Tags: planning, readonly, coding:plan List tasks that are ready to work on — no unresolved blockers. A task is “ready” when:
  1. Its status is “pending” (not started yet)
  2. All tasks that block it (via ‘blocks’ dependencies) have status “completed”
This is the deterministic way for agents to know what to pick up next. Tasks with no blocking dependencies are always ready (if pending). RETURNS:
  • List of ready tasks with their details
  • Total count of ready tasks vs total pending

list_tasks

Tags: planning, readonly, coding:plan, coding:default List all tasks for the current plan. WHEN TO USE:
  • When you need to see all tasks in the plan
  • To check task progress and status
  • To understand what work needs to be done
  • BEFORE delegating: the ready set tells you what can be worked at once
RETURNS:
  • List of all tasks with their status, title, and hierarchy
  • Tasks are ordered by position and show parent-child relationships
  • Assignee for any task that has been claimed, so you can see what other agents are already working on and avoid handing out the same task twice
  • A count of tasks that are READY (pending with no incomplete blocker). Ready tasks have no dependency between them, so they are meant to be delegated together in one turn rather than one after another.
If this thread has no plan of its own, the plan of the nearest ancestor thread is shown — the board you were spawned from. It is read-only here; you can still update the status of a task assigned to you.

remove_dependency

Tags: planning, coding:plan Remove a dependency between two tasks. Specify from_task, to_task, and type to identify which dependency to remove.

update_plan

Tags: planning, coding:plan Update an existing plan’s details or status. WHEN TO USE:
  • When you need to modify the plan based on new information
  • When pivoting to a different approach
  • When marking a plan as completed or cancelled
UPDATES ALLOWED:
  • Title: Update the plan title
  • Description: Add new information, document pivots
  • Status: pending|in_progress|completed|cancelled
  • Complexity: simple|moderate|complex
BEST PRACTICES:
  • Document why changes are being made
  • Keep the description updated with current approach
  • Use this to track progress and pivots

update_task

Tags: planning, coding:plan, coding:default Update a task’s status, details, or metadata. WHEN TO USE:
  • When starting work on a task (mark as in_progress)
  • When completing a task (mark as completed)
  • When a task is blocked or failed
  • To update task description with findings
  • To add notes, hints, or discoveries to metadata
  • To claim a task by setting assignee + in_progress
STATUS OPTIONS:
  • pending: Not started yet
  • in_progress: Currently working on it
  • completed: Successfully finished
  • failed: Could not complete
  • blocked: Waiting on something (add blocker to notes)
  • skipped: Decided not to do
  • cancelled: No longer needed
ASSIGNEE:
  • Free-form text identifying who is working on this task
  • Use a descriptive label: spawn title, role name, or agent identifier
  • Claim pattern: update_task(task_id=“X”, status=“in_progress”, assignee=“researcher-auth”)
  • Other agents see assignments in list_tasks and skip claimed work
METADATA OPTIONS:
  • notes: Add discoveries, blockers, or important context
  • preferred_agent: Suggest which agent should handle this
  • tool_hints: Suggest tools to use [“use_bash”, “search_first”]
  • dependencies: Document what this depends on
  • next_steps: What to do after this task
BEST PRACTICES:
  • Update status when you start and finish tasks
  • Add descriptions to document what was done
  • Use metadata.notes for blockers when marking as blocked
  • Add tool_hints for complex tasks to guide future execution
  • Set assignee when claiming a task to prevent duplicate work

File Operations

Tools for reading, writing, and modifying files.

edit

Tags: file, coding:default Make a precise text replacement in a single file, or create/delete file content. One edit per call. NOTE: To make several edits at once, issue multiple edit tool calls IN THE SAME MESSAGE — they run in parallel. Do NOT try to pack multiple edits into one call. Edits to DIFFERENT files in one message run at the same time. Edits to the SAME file are applied one at a time, in an unspecified order, each one seeing the result of the ones before it. So batch same-file edits freely — but only when they are independent: each old_string must still match after the others have applied. Two edits whose old_string regions overlap, or where one creates the text the other matches, must be sent in separate messages, or the second will fail to match. WHEN TO USE:
  • Precise text replacements
  • Creating a new file (empty old_string)
  • Deleting specific content (empty new_string)
  • Renaming a variable/function (with replace_all)
ALWAYS PREFER THIS TOOL OVER write. Turn latency is set by how many tokens you GENERATE, so rewriting an existing file costs minutes of generation for a change edit makes in seconds. write is for creating NEW files; for anything that already exists, use edit. If an old_string fails to match, re-read the exact region and retry the edit — falling back to a full rewrite is the most expensive move available. WHEN NOT TO USE:
  • Moving/renaming files: Use the shell tool’s mv command
COMMON MISTAKES TO AVOID:
  • Insufficient context in old_string (needs 3-5 lines)
  • Forgetting whitespace/indentation must match exactly
  • Not checking if text appears multiple times
USAGE PATTERNS:

Replace Text

file_path: “/path/to/file.go” old_string: “Include 3-5 lines before AND after” new_string: “Your replacement text” replace_all: false

Multiple Edits

Issue one edit call per change, all in the same message. For example, to edit two files at once, send two edit tool calls in parallel: edit(file_path=“/path/to/file1.go”, old_string=“old text 1”, new_string=“new text 1”) edit(file_path=“/path/to/file2.go”, old_string=“old text 2”, new_string=“new text 2”)

Create New File

file_path: “/path/to/new/file.go” old_string: "" new_string: “file contents”

Delete Content

file_path: “/path/to/file.go” old_string: “text to remove” new_string: ""

Rename Variable

file_path: “/path/to/file.go” old_string: “oldName” new_string: “newName” replace_all: true

CRITICAL REQUIREMENTS

  1. UNIQUENESS (when replace_all=false):
    • Include 3-5 lines of context BEFORE
    • Include 3-5 lines of context AFTER
    • Match whitespace/indentation EXACTLY
  2. VERIFICATION CHECKLIST: Check how many times text appears Include enough context for uniqueness Verify parent directories exist (new files)
  3. FAILURE CONDITIONS:
    • old_string not found → FAILS
    • Multiple matches (without replace_all) → FAILS
    • Whitespace mismatch → FAILS

BEST PRACTICES

  • Include ample context
  • Use replace_all for systematic renames
  • Parallelize independent edits as separate calls in one message
  • Verify edits don’t break code

WORKS WELL WITH

  • AFTER: shell (test changes)
  • ALTERNATIVE: Write (complete rewrite)

PARAMETERS

  • file_path: Absolute path (required)
  • old_string: Text to find (exact match)
  • new_string: Replacement text
  • replace_all: Replace all occurrences (optional)
Remember: This tool requires EXACT text matching including all whitespace and indentation.

find_replace

Tags: file Performs find and replace operations across multiple files matching a glob pattern. WHEN TO USE:
  • Renaming variables, functions, or classes across multiple files
  • Updating imports or module references project-wide
  • Fixing consistent typos or naming conventions
  • Batch updating configuration values
  • Refactoring patterns across the codebase WHEN NOT TO USE:
  • Single file edits: Use Edit tool instead
  • Complex structural changes: Use Patch tool
  • Context-dependent replacements: Use Edit or Patch for precision FEATURES:
  • Glob pattern file filtering (e.g., ”**/*.js”, “src/**/*.{ts,tsx}”)
  • Regular expression support with capture groups
  • Case-insensitive matching option
  • Preview mode to see changes before applying
  • Automatic file history tracking USAGE PATTERNS:
Use preview=true to see what would change before committing. Preview mode does not require permission, making it ideal for scoping changes. find_pattern: “oldFunction” replace_text: “newFunction” file_glob: ”**/*.js” preview: true

Simple Text Replacement

find_pattern: “oldFunction” replace_text: “newFunction” file_glob: ”**/*.js”

Regex with Capture Groups

find_pattern: “import (.) from ‘old-module’” replace_text: “import $1 from ‘new-module’” use_regex: true file_glob: ”**/.ts”

Case-Insensitive Replacement

find_pattern: “TODO” replace_text: “FIXME” ignore_case: true file_glob: “**/*.{js,ts,jsx,tsx}”

CRITICAL REQUIREMENTS

  1. PREVIEW FIRST:
    • ALWAYS call with preview=true first to verify the pattern matches and scope
    • Preview shows diffs of what would change without modifying any files
    • After reviewing the preview, call again without preview to apply
  2. FILE READING:
    • Checks modification times to prevent conflicts
    • Validates file access permissions
  3. PATTERN MATCHING:
    • Literal text matching by default
    • Regex patterns with use_regex=true
    • Case sensitivity controlled by ignore_case
  4. SAFETY CHECKS:
    • Atomic operation (all or nothing)
    • Preserves file history

BEST PRACTICES

  • ALWAYS use preview=true first to see what changes would be made
  • Use specific file globs to limit scope
  • Review the preview diffs carefully before applying
  • Test regex patterns with preview before committing

WORKS WELL WITH

  • BEFORE: preview=true (see changes first)
  • BEFORE: Grep (find occurrences)
  • AFTER: shell (run tests)
  • ALTERNATIVE: Edit (single file)
  • ALTERNATIVE: Patch (complex multi-file edits)

PARAMETERS

  • find_pattern: Text or regex pattern to find (required)
  • replace_text: Replacement text (required)
  • file_glob: File filter pattern (optional, defaults to all files)
  • ignore_case: Case-insensitive matching (optional, default false)
  • use_regex: Treat pattern as regex (optional, default false)
  • preview: Preview mode - show what would change without applying (optional, default false) Remember: Use preview=true first, then apply.

move_code

Tags: file Move or copy a block of code from one location to another, within the same file or across files. WHEN TO USE:
  • Reorganizing code within a file
  • Moving a function/method to a different file
  • Extracting code into a new location
  • Copying code snippets between files
  • Reordering functions in a file
WHEN NOT TO USE:
  • For simple cut/paste of small text - use edit tool
  • For renaming across files - use find_replace tool
  • For complex multi-file refactors - consider using the refactor agent
HOW IT WORKS:
  1. Extracts lines source_start to source_end from source_file
  2. Inserts the extracted code AFTER target_line in target_file
  3. If operation is “move” (default), deletes the original lines from source
  4. If operation is “copy”, keeps the original lines
EXAMPLES:

Move function to end of file

Copy code block to another file

Insert at beginning of file

CRITICAL REQUIREMENTS:
  1. Line numbers are 1-indexed
  2. source_start and source_end are INCLUSIVE
  3. target_line = 0 inserts at the very beginning
  4. For same-file moves, the tool handles line number shifts automatically
BEST PRACTICES:
  • For same-file moves, be aware that line numbers shift after the operation
  • Add blank lines in the extracted code if needed for proper spacing
  • Check for any imports/dependencies that might need to be added to target file

prove_test

Tags: execution, file Prove a regression test actually tests your fix: one call runs the test with the fix reverted (it must FAIL) and again with the fix in place (it must PASS). This replaces patching the old code back in by hand — and never use git stash for it. WHEN TO USE:
  • After writing a fix and a test for it, before reporting the work done. “Confirm a new test fails before the fix and passes after” is exactly this call.
  • When you are not sure a test exercises the code you changed.
HOW IT WORKS:
  1. Snapshots the exact bytes and mode of every file in files.
  2. Writes each file’s baseline version (default: git HEAD; any git revision works). A file that does not exist at baseline is removed for the run; a file your fix deleted is put back.
  3. Runs command and expects a NON-ZERO exit.
  4. Restores your files — always, including on timeout, cancellation or a crash — and verifies them byte for byte.
  5. Runs command again and expects exit 0.
PARAMETERS THAT MATTER:
  • files: the IMPLEMENTATION files of the fix. NOT the test file — the test must stay in place for both runs.
  • command: as narrow as possible — one package, one test (‘go test -run TestX ./pkg/foo’, ‘npx vitest run src/x.test.ts’). It runs twice.
VERDICTS:
  • proven: fails without the fix, passes with it.
  • passes_without_fix: the test does not exercise the change. Strengthen it.
  • fails_with_fix: the fix does not make the test pass.
  • baseline_does_not_compile: the before-run failed to BUILD (typical when the fix adds a symbol the test calls). That is NOT proof; report it as such.
  • conflict: another writer changed a named file mid-run. Their content was kept and yours preserved; the result says where.
  • restore_failed / inconclusive: see the result text.
SHARED CHECKOUTS — READ THIS: While the before-run executes, the named files hold their OLD content on disk. Anything else building or testing in the same working tree during that window sees the old code. The window is one run of command, which is why it should be narrow. Two prove_test calls on the same file wait for each other, and if another agent edits a named file meanwhile, prove_test keeps their edit instead of overwriting it.

read_attachment

Tags: file, readonly, coding:plan, coding:default Read the contents of a file the user attached to the conversation. WHEN TO USE:
  • When the conversation references an attachment (by id) whose contents you have not yet seen.
  • Specifically for PDF attachments: their pages are read on demand through this tool.
HOW TO USE:
  • Provide the attachment_id from the attachment reference.
  • For PDFs: use the pages parameter to read a page range (e.g. “1-5”). PDFs larger than 10 pages require a page range; max 20 pages per request.
NOTES:
  • PDF pages are returned as a native document block the model can read directly (text and layout).
  • Image and text attachments are already provided inline in the conversation and do not need this tool.

save_attachment

Tags: file, coding:default Write an already-stored attachment to a file on disk. WHEN TO USE:
  • An image, PDF or file already exists as an attachment and the user now wants it as a file in the project.
  • A previous generate_image call reported an attachment id but was not given save_to, or its save_to write failed.
WHY THIS RATHER THAN REGENERATING:
  • The bytes already exist and are addressable. Calling generate_image again costs another billed generation AND produces a DIFFERENT image — image models are not deterministic, so the file you would write is not the image the user approved. Always prefer save_attachment for an image you already have.
THIS IS NOT read_attachment:
  • read_attachment pulls the contents into the conversation so you can LOOK at them. This tool moves the bytes server-side, straight from storage to the file, without routing them through the conversation. Use this one to produce a file; use that one to inspect contents.
HOW TO USE:
  • Pass the attachment_id and the destination path. Relative paths resolve against the working directory; use repo in a multi-repo project.
NOTES:
  • Binary content is written byte-for-byte, so images and PDFs stay valid.
  • Parent directories are created as needed.

view

Tags: file, readonly, coding:plan, coding:default File viewing tool that reads and displays the contents of files with line numbers, allowing you to examine code, logs, or text data. WHEN TO USE:
  • Reading contents of specific files (source code, configs, logs)
  • Examining text-based file formats
HOW TO USE:
  • Provide the file path
  • Optional: offset (starting line) and limit (number of lines)
  • For PDFs: use the pages parameter to read a page range (e.g. “1-5”). PDFs larger than 10 pages require a page range; max 20 pages per request.
  • Issue multiple view tools in a single request for improved performance
FEATURES:
  • Displays file contents with line numbers for easy reference
  • Can read from any position in a file using the offset parameter
  • Handles large files by limiting the number of lines read
  • Automatically truncates very long lines for better display
  • Suggests similar file names when the requested file isn’t found
LIMITATIONS:
  • Maximum output size is 64KB (~16K tokens) - larger files are truncated with head+tail
  • Default reading limit is 1500 lines, which reads most source files whole
  • Lines longer than 500 characters are truncated
  • Cannot display binary files (executables, archives, etc.)
  • Images up to 5MB are supported (JPEG, PNG, GIF, BMP, SVG, WebP)
  • PDFs up to 5MB are supported; large PDFs are read a page range at a time via the pages parameter
TIPS:
  • Prefer ONE whole-file read over several paged reads: each call costs a model round-trip, while the read itself takes milliseconds. Omit offset/limit unless the file is genuinely too big to arrive in one piece.
  • A file OVER ~64KB cannot arrive whole whatever limit you pass — the response is capped and you get head+tail with the middle removed. Two calls settle it, and neither is a search: read the head (default) to get the shape, then ONE offset read for the region you need. The truncation notice tells you the total line count, so you can aim the second call directly.
  • Do NOT fall back to repeated ‘grep’ on a large file to page through it by symbol. Measured: eleven agents greping one 52KB proto one message at a time was the single largest recoverable cost in a long run — each grep is a whole turn and returns less context than one offset read.
  • Issue several view calls in a SINGLE message to read independent files at once
  • Use with Glob tool to first find files you want to view
  • For code exploration, first use Grep to find relevant files, then View to examine them
  • If output is truncated, use offset to read the remaining section

write

Tags: file, coding:default File writing tool that creates or updates files in the filesystem. WHEN TO USE:
  • Creating new files or updating existing files
  • Saving generated code, configurations, or text data
HOW TO USE:
  • Provide the file path and content to write
  • Parent directories are created automatically
FEATURES:
  • Creates new files or overwrites existing ones
  • Auto-creates parent directories
  • Checks for external modifications for safety
  • Avoids unnecessary writes when content unchanged
LIMITATIONS:
  • Cannot append (rewrites entire file)
  • Replaces the ENTIRE file — to change part of one, prefer Edit
REPLACING AN EXISTING FILE:
  • Just write over it. Do NOT delete it first — that costs an extra turn and removes the very guard that protects you.
  • Reading it first is optional, not required. An unread file is overwritten and the result carries a diff of what was replaced (capped at 60 lines) so you can repair a mistaken clobber with Edit.
  • Reading it first is what ARMS the safety check: once you have read a file, a Write is REJECTED if it changed on disk since. That is how you find out another agent owns the file too. Read first when that matters — a shared file, a concurrent run — and report the rejection rather than re-issuing the Write.
BATCHING — this is the main cost:
  • A turn costs a full model generation whether it carries one write or six, so the TURN COUNT is the cost, not the file count. Issue every write whose content you ALREADY HOLD in ONE message; they run in parallel.
  • The exception is a write whose content depends on a previous write’s result. That one waits for it.
TIPS:
  • Use the LS tool to verify the correct location when creating new files
  • Combine with Glob and Grep tools to find and modify multiple files
  • Always include descriptive comments when making changes to existing code

Information Retrieval

Tools for searching code, finding files, and fetching external content.

code_context

Tags: analysis, search, readonly, coding:plan, coding:default Resolve a code symbol to its definition, callers, callees, and implementations in ONE call. ⚠️ GO AND TYPESCRIPT/JAVASCRIPT ONLY. Call graphs are resolved by a language server (gopls for .go, tsserver for .ts/.tsx/.js/.jsx), and only those two are supported. For any other language — Python, Ruby, Java, Rust, C# — this falls back to a text search that CANNOT resolve call edges, and you should use bash + rg instead. Use this INSTEAD of a multi-step grep walk whenever the question is about a symbol’s relationships. A grep walk costs one turn per hop and each turn re-derives what to search next; this returns the whole neighborhood at once. WHEN TO USE THIS TOOL:
  • “Who calls X?” / “What does X call?” — the answers grep cannot compute, because a call site never names the receiver’s type.
  • “What implements this interface?” — neither Go nor TypeScript records that at the implementation site, so there is no text to search for.
  • “Where is X defined?” when the name is ambiguous across packages or modules.
  • Orienting in unfamiliar code: one call replaces the definition->callers->callees walk.
LANGUAGE SUPPORT:
  • Go (.go) — resolved by gopls. Authoritative.
  • TypeScript / JavaScript (.ts .tsx .js .jsx .mts .cts) — resolved by tsserver from the project’s own TypeScript install. Authoritative.
  • Everything else (Python, Ruby, Java, …) — a text engine reports call sites and their enclosing function. Useful for locating, but approximate: it cannot see dynamic dispatch and may include same-named methods on unrelated types. The response labels this explicitly.
WHEN NOT TO USE THIS TOOL:
  • Full-text or pattern search (“find every TODO”, “which files mention retry”) — use bash + rg.
  • Reading a file you already located — use view.
PREFER THIS OVER GREP FOR ANY NAMED SYMBOL. If you are about to run rg 'SomeFunction' or grep -n 'SomeType' against Go or TypeScript, call this instead — it returns everything that search would have found plus the things it cannot find, in one call rather than one call per hop. HOW TO USE: Usually just: code_context(symbol: “ResolveDaemon”). The defaults are the common case — the definition, its source, and a 3-level call map, which is what “how does this work” actually needs. Every parameter below is optional.
  • symbol (REQUIRED): the identifier alone, unqualified and with no regex. Good: “ResolveDaemon”, “classifyDaemonWait”, “DaemonRegistryService”. Bad: “svc.ResolveDaemon” (drop the receiver), “Resolve.*” (not a pattern), “func ResolveDaemon” (just the name).
  • want: which relationships to return. Default “all”. “all” definition + source + call map + implementations “callers” who reaches this — trace a request path inbound “callees” what this drives — see the work a function delegates “implementations” on an interface: who implements it. On a concrete method: which interfaces it satisfies (the reverse lookup). “definition” still includes the graph; narrows the emphasis, not the answer.
  • depth: levels of call graph to expand as a tree. Default 3, max 5. Depth 3 answers “who ultimately triggers this” for typical handler->service->repo layering. Use depth 1 when you only want the immediate neighbors as flat lists.
  • file: a path FRAGMENT to disambiguate when a name is declared many times (Execute has dozens here). The response tells you when this is needed and lists the alternatives — pass e.g. file: “daemon_router_nats.go”.
  • include_source: first ~30 lines of the definition. On by default, because the usual next question is “what does it do” and that would cost another turn. Set false when you want only the graph.
  • scope: “project” (default) keeps results in this workspace INCLUDING sibling repos linked into it, and excludes the standard library, node_modules and vendored code. Use “all” only to deliberately read into a dependency.
  • repo: multi-repo projects only — “root” or a repo name. Omit otherwise.
  • limit: max entries per flat section. Default 25, max 200. The response says when a section was truncated.
OUTPUT: An ENGINE line naming what resolved the query and how far to trust it, a DEFINITION line with the first ~30 lines of source, then either a CALL MAP tree (depth > 1) or flat CALLERS / CALLEES / IMPLEMENTATIONS sections. Truncation is always stated. NOTES:
  • The first call in a large repo pays a one-time index cost (a few seconds); later calls are fast.
  • Results include test files; they are real callers.
  • If a language server is missing, the response says so and names the install command.

fetch

Tags: web, readonly, coding:plan, coding:default Fetches content from a URL and returns it in the specified format. Uses Mozilla Readability to automatically extract main page content, stripping navigation, footers, ads, and other chrome. Returns only the readable content for text and markdown formats. WHEN TO USE THIS TOOL:
  • Use when you need to download content from a URL
  • Helpful for retrieving documentation, API responses, or web content
  • Useful for getting external information to assist with tasks
HOW TO USE:
  • Provide the URL to fetch content from
  • Specify the desired output format (text, markdown, or html)
  • Optionally set a timeout for the request (default 30s, hard cap 60s)
FEATURES:
  • Automatic content extraction using Mozilla Readability (strips nav, ads, footers)
  • Supports three output formats: text, markdown, and html
  • Follows up to 5 HTTP redirects, http/https only
  • Detects likely JavaScript-rendered pages and warns you
  • Sets reasonable timeouts to prevent hanging
PARAMETERS:
  • max_size: Maximum bytes to read from the response (default: 16000, ~16KB; hard cap: 1048576, 1 MiB). Values above the cap are lowered to it. When the response is longer than the limit it is cut off and a “[Content truncated …]” note is appended; the call still succeeds. The limit applies to the decompressed body.
IMPORTANT LIMITATIONS:
  • Cannot render JavaScript. Single-page apps (SPAs) will return little or no content. The response metadata will include possible_js_rendered=true when this is detected. For JS-heavy sites, consider using browser tools instead.
  • Default maximum response size is 16KB (use max_size to raise it, up to 1 MiB)
  • Only supports HTTP and HTTPS protocols
  • Cannot handle authentication or cookies
  • Some websites may block automated requests
TIPS FOR BETTER RESULTS:
  • For GitHub repos, use raw.githubusercontent.com URLs instead of github.com (e.g., https://raw.githubusercontent.com/org/repo/main/README.md)
  • For API docs that are JS-rendered SPAs, look for the OpenAPI/Swagger JSON spec URL instead
  • Use text or markdown format for documentation (html returns raw markup with all chrome)
  • If the response says possible_js_rendered=true, the page needs JavaScript to render. Try finding an alternative URL, a raw content source, or use browser tools.
  • Adjust max_size for larger documents, up to the 1 MiB cap (but consider context limits)
  • Pages larger than 1 MiB are always truncated; look for a smaller raw/API URL instead
RESPONSE METADATA:
  • content_length: Size of the extracted content
  • raw_html_size: Size of the original HTML before extraction (for HTML pages)
  • truncated: Whether content was truncated to fit max_size
  • encoding_used: The format that was applied
  • page_title: Page title extracted by Readability (when available)
  • possible_js_rendered: True if the page appears to be JavaScript-rendered (very little content extracted)
  • used_readability: True if Readability content extraction was applied

project_analyzer

Tags: analysis, readonly, coding:plan Analyzes project structure, detects languages, build systems, and test frameworks

shell

Tags: execution, shell, search, coding:default Execute shell commands for building, testing, and system operations in a stateless shell.

⚠️ THE EXECUTING MACHINE’S PLATFORM IS NOT KNOWN — DO NOT ASSUME BASH

Commands run on a remote machine whose operating system has not been reported to this session, so it may be a POSIX shell (bash -c) or PowerShell on Windows. Write portable commands, and PROBE before relying on either dialect:
  • Run one cheap command first (uname -s, or $PSVersionTable) and read the result to find out which shell you actually have, then commit to that dialect.
  • Until you know: prefer one command per call over chaining, avoid &&, ||, $VAR expansion, POSIX redirection and shell globbing, all of which mean different things (or nothing) in PowerShell.
  • Do not guess path separators; use paths exactly as they were given to you.

WHEN NOT TO USE THIS TOOL

  • File editing → Use Edit/Write tools
  • File reading → Use View tool

🔎 SEARCHING THE CODEBASE

The single best thing you can do when searching the codebase is combine multiple tools calls in each turn. The vast majority of time is eaten up in LLM turns, so reducing that is precious. When searching through deeper call chains, the best way to do this is via an LSP that gives you the full graph, otherwise you may spend 50-100+ calls at ~10s per turn.

Go and TypeScript — use the ‘code_context’ TOOL, not this one

IMPORTANT: for “who calls X”, “what does X call”, “what implements X”, or “where is X defined”, call code_context(symbol: “X”). One call returns the definition, its source, and a 3-level call map. Do NOT hand-run gopls or tsserver here, and do NOT walk callers with rg: a call site never names its receiver’s type, so a grep walk matches every same-named method and compounds the error at each level.

Other languages

No language server, so rg IS the tool. Keep caller walks shallow and verify them. Load the ‘code-search’ skill for the per-language capability table. Prefer ripgrep for other generic searches:
  • Otherwise use ‘rg’ when available, falling back to ‘grep -r’ / ‘find’ when it is not.
  • ALWAYS search from a relative path (‘rg pattern .’, ‘rg pattern internal/’), never an absolute root.
  • Exclude vendored trees, which are large and rarely what you want: rg —glob ‘!node_modules’ —glob ‘!.git’ —glob ‘!dist’ —glob ‘!vendor’ (‘rg’ already honours .gitignore, which usually covers these.)
  • Bound the results: ‘rg -l’ for filenames only, ‘rg -m 20’, or pipe to ‘head’. An unbounded match dump can exhaust the output budget on a large repo.
  • ⚠️ ‘rg -r’ IS NOT RECURSIVE — do not reach for it out of grep habit. In rg, -r is —replace, so ‘rg -r pattern .’ silently treats your PATTERN as the replacement text and the next argument as the pattern, printing rewritten lines that look like real matches. rg already searches recursively by default, so the flag you want is no flag at all: ‘rg pattern .’.
  • Other flags that differ from grep: -t/-T select file TYPES (‘rg -t go’), not the grep meanings, and -f reads patterns from a file.

🚫 NEVER SCAN THE FILESYSTEM

Commands like ‘find / -name …’, ‘find ~ …’ or ‘grep -r … /usr’ are REFUSED before they run: they read the whole machine, take minutes, and starve every other agent on this disk.
  • To find something in the project → search a relative path, as above.
  • To find a DEPENDENCY’s source on disk → ask the package manager, do not scan: ‘go list -m -f “{{.Dir}}” <module>’, ‘go env GOMODCACHE’, ‘npm root’.
  • If you truly need a filesystem search, name a specific directory.

⛓️ CHAIN PROBES — ONE CALL ANSWERS MANY QUESTIONS

A turn costs a full model generation whether it carries ONE probe or NINE. The command string is where you buy that back: separate probes with ’;’ and label each with an echo, and one call returns the whole picture. ls internal/handlers/; echo ”=== proto ===”; grep -n ‘^message|^service’
proto/services/foo/v1/foo.proto | head -40; echo ”=== migrations ===”;
ls db/migrations/ | tail -5
Chaining also works when a probe DEPENDS on the previous one, which parallel tool calls cannot express: f=(rg−l′ListWidgetsRequest′proto/);echo"(rg -l 'ListWidgetsRequest' proto/); echo "f”; grep -n ‘ListWidgets’ -A 12 “$f” Reach for it whenever you are about to run a second search to interpret the first. Measured: agents that chain average ~8 probes per call; agents that do not average ~3, and the difference is turns — the single largest recoverable cost in a long run. Independent tool calls can ALSO run in parallel in one response. Chaining and parallel calls compose: issue every call you have already decided in the SAME turn, and chain the probes inside each one. Never split calls you have already decided across turns — that is the one pattern that costs a generation for nothing.

Output Processing

  • Default output limit is 16000 bytes (use max_output to customize)
  • Use tail_lines to get only the last N lines of output
  • Output metadata includes truncation info and original size
Usage notes:
  • The command argument is required.
  • You can specify an optional timeout in milliseconds (up to 600000ms / 10 minutes). If not specified, commands will timeout after 60 seconds.
  • Use ‘run_in_background: true’ to run long-running commands in the background. You can then use shell_output to check output, shell_kill to terminate, and shell_list to see all running processes.
  • Searching the codebase IS a use of this tool (prefer ‘rg’, scoped to a relative path — see above). For reading whole files, prefer the View tool over ‘cat’/‘head’/‘tail’.
  • VERY IMPORTANT: YOU MUST AVOID WRITING FILES USING SHELL. Please use the appropriate edit and create tools.
  • When issuing multiple commands, use the ’;’ or ’&&’ operator to separate them. DO NOT use newlines (newlines are ok in quoted strings).
STATELESS EXECUTION:
  • IMPORTANT: Each command runs in a fresh, stateless shell. Environment variables and directory changes from previous commands do NOT persist.
  • IMPORTANT: The current working directory is ALWAYS automatically set to the current worktree. There is NO need to cd to the worktree before running commands - just run them directly.
  • To change to a subdirectory within the worktree, use ‘cd’ as part of a compound command (e.g., ‘cd subdir && npm test’).
  • Environment variables set in prior shell sessions will NOT be included. Use the ‘env’ parameter to set environment variables for a specific command execution.
  • If you need to maintain state across commands (e.g., activating a virtual environment), combine commands with && or ; operators.
  • Background processes run in separate shell instances and also start fresh without inherited state.
Important:
  • Return an empty response - the user will see the output directly
  • Never update git config

sourcegraph

Tags: analysis, readonly, coding:plan Search code across public repositories using Sourcegraph’s GraphQL API. WHEN TO USE THIS TOOL:
  • Use when you need to find code examples or implementations across public repositories
  • Helpful for researching how others have solved similar problems
  • Useful for discovering patterns and best practices in open source code
HOW TO USE:
  • Provide a search query using Sourcegraph’s query syntax
  • Optionally specify the number of results to return (default: 10)
  • Optionally set a timeout for the request
QUERY SYNTAX:
  • Basic search: “fmt.Println” searches for exact matches
  • File filters: “file:.go fmt.Println” limits to Go files
  • Repository filters: “repo:^github.com/golang/go$ fmt.Println” limits to specific repos
  • Language filters: “lang:go fmt.Println” limits to Go code
  • Boolean operators: “fmt.Println AND log.Fatal” for combined terms
  • Regular expressions: “fmt.(Print|Printf|Println)” for pattern matching
  • Quoted strings: ""exact phrase"" for exact phrase matching
  • Exclude filters: “-file:test” or “-repo:forks” to exclude matches
ADVANCED FILTERS:
  • Repository filters:
    • “repo:name” - Match repositories with name containing “name”
    • “repo:^github.com/org/repo$” - Exact repository match
    • “repo:org/repo@branch” - Search specific branch
    • “repo:org/repo rev:branch” - Alternative branch syntax
    • “-repo:name” - Exclude repositories
    • “fork:yes” or “fork:only” - Include or only show forks
    • “archived:yes” or “archived:only” - Include or only show archived repos
    • “visibility:public” or “visibility:private” - Filter by visibility
  • File filters:
    • “file:.js$” - Files with .js extension
    • “file:internal/” - Files in internal directory
    • “-file:test” - Exclude test files
    • “file:has.content(Copyright)” - Files containing “Copyright”
    • “file:has.contributor([email protected])” - Files with specific contributor
  • Content filters:
    • “content:“exact string"" - Search for exact string
    • “-content:“unwanted"" - Exclude files with unwanted content
    • “case:yes” - Case-sensitive search
  • Type filters:
    • “type:symbol” - Search for symbols (functions, classes, etc.)
    • “type:file” - Search file content only
    • “type:path” - Search filenames only
    • “type:diff” - Search code changes
    • “type:commit” - Search commit messages
  • Commit/diff search:
    • “after:“1 month ago"" - Commits after date
    • “before:“2023-01-01"" - Commits before date
    • “author:name” - Commits by author
    • “message:“fix bug"" - Commits with message
  • Result selection:
    • “select:repo” - Show only repository names
    • “select:file” - Show only file paths
    • “select:content” - Show only matching content
    • “select:symbol” - Show only matching symbols
  • Result control:
    • “count:100” - Return up to 100 results
    • “count:all” - Return all results
    • “timeout:30s” - Set search timeout
EXAMPLES:
  • “file:.go context.WithTimeout” - Find Go code using context.WithTimeout
  • “lang:typescript useState type:symbol” - Find TypeScript React useState hooks
  • “repo:^github.com/kubernetes/kubernetes$ pod list type:file” - Find Kubernetes files related to pod listing
  • “repo:sourcegraph/sourcegraph$ after:“3 months ago” type:diff database” - Recent changes to database code
  • “file:Dockerfile (alpine OR ubuntu) -content:alpine:latest” - Dockerfiles with specific base images
  • “repo:has.path(.py) file:requirements.txt tensorflow” - Python projects using TensorFlow
BOOLEAN OPERATORS:
  • “term1 AND term2” - Results containing both terms
  • “term1 OR term2” - Results containing either term
  • “term1 NOT term2” - Results with term1 but not term2
  • “term1 and (term2 or term3)” - Grouping with parentheses
LIMITATIONS:
  • Only searches public repositories
  • Rate limits may apply
  • Complex queries may take longer to execute
  • Maximum of 20 results per query
TIPS:
  • Use specific file extensions to narrow results
  • Add repo: filters for more targeted searches
  • Use type:symbol to find function/method definitions
  • Use type:file to find relevant files

websearch

Tags: web, readonly, coding:plan, coding:default Search the web using DuckDuckGo’s HTML search. WHEN TO USE THIS TOOL:
  • Finding current information not available in the assistant’s training data
  • Researching documentation, tutorials, or examples online
  • Looking up error messages or debugging information
  • Finding libraries, tools, or frameworks
  • Checking current status of services or projects
  • Discovering recent developments or news about technologies
HOW TO USE:
  • Provide a search query as you would in a web browser
  • Optionally specify the number of results (default: 10, max: 20)
QUERY GUIDELINES:
  • Use simple, natural language queries with specific keywords
  • Keep queries short and focused (3-8 words works best)
  • Use minus (-) to exclude terms: python tutorial -django
  • Quotes work for simple exact phrases: “react hooks” tutorial
IMPORTANT - UNSUPPORTED QUERY SYNTAX: DuckDuckGo’s HTML search does NOT support these features (they will return zero results):
  • Boolean operators: OR, AND (e.g. “PUT” OR “POST” will FAIL)
  • Complex quoted phrase combinations (multiple quoted phrases with operators)
  • site: operator is unreliable and often returns no results
  • filetype: operator is unreliable If you need boolean-style searches, run multiple simple queries instead.
EXAMPLES OF GOOD QUERIES:
  • “golang context timeout example” - Simple keywords
  • “anthropic claude api documentation” - Natural language
  • “Customer.io transactional API” - Product + feature
  • “react hooks tutorial 2024” - Topic + timeframe
EXAMPLES OF BAD QUERIES (will return 0 results):
  • “PUT” OR “POST” OR “PATCH” email content - Boolean operators don’t work
  • site:customer.io/docs/api specific-page - site: is unreliable
  • “exact phrase 1” OR “exact phrase 2” - Complex boolean combos fail
RESEARCH STRATEGY:
  • Start with broad queries, then narrow based on results
  • If a search returns 0 results, SIMPLIFY the query - don’t add complexity
  • After 3-4 searches on the same topic, synthesize what you have rather than keep searching
  • For API documentation, search for the official SDK/client library on GitHub instead
  • For GitHub content, prefer fetching raw.githubusercontent.com URLs over github.com
RESPONSE FORMAT: Returns a list of search results with:
  • Title: The title of the search result
  • Description: A brief description/snippet from the page
  • URL: The link to the resource
LIMITATIONS:
  • Maximum of 20 results per query
  • May have rate limits if used excessively
  • DuckDuckGo HTML search has limited query syntax (see above)
  • Results may be less comprehensive than Google for niche technical queries
TIPS:
  • Start with fewer results (5-10) for faster responses
  • Use specific queries to get more relevant results
  • Combine with the fetch tool to retrieve full page content from results

Workflow Management

Tools for managing and inspecting workflows, presets, and scenarios.

cel_eval

Tags: workflow, readonly Evaluates a CEL expression or {{ }} template against a context you supply, exactly as a workflow would, and returns the value and its type, or a precise error. WHEN TO USE:
  • To test a trigger filter, an input mapping or a condition in ONE call, instead of activating the trigger and waiting for an event
  • To check what a template produces, and what type (a pure {{ }} keeps its type: a number stays a number)
  • To find out why an expression fails (the error says whether it is syntax, compile or evaluation, and where)
CONTEXT:
  • integration + event: trigger.payload is GENERATED from the payload that integration declares for the event (the same schema workflow validation checks filters against). Supply trigger_payload to override just the fields your expression depends on; it is merged over the sample.
  • trigger_payload alone: a webhook or other source you describe yourself.
  • inputs / nodes: values for inputs.* and nodes.<id>.* (scope run).
  • With no expression, returns the trigger the event delivers, so you can see what there is to write against.
RETURNS: JSON: value, type, kind (expression|template), and findings (reads the declared payload rules out, which a loose sample can hide: a filter that passes here can still fail on a real event if it reads a field the payload never has). On failure, error: phase (syntax|compile|eval|request), message, line, column, hint. Evaluation is bounded (CEL cost limit) and has no side effects.

create_workflow

Tags: workflow Create a new workflow. Returns the workflow UUID which you can then use with get_workflow, edit_workflow, and write_workflow. Workflows start as DRAFTS: stored even with validation errors, so you can iterate, but never runnable. Pass complete: true (here, or on a later edit_workflow/write_workflow) once it validates to make it runnable — that is rejected while it has errors. YAML that does not parse is rejected either way. Parameters:
  • name: (optional) Workflow name. A random name is generated if omitted.
  • content: (optional) Complete workflow YAML. The default agent template is used if omitted.
  • complete: (optional) true to mark it complete (runnable). Default: draft.
Response: The resulting status and every current validation error and warning, plus JSON with id, name, slug, and status. Example — create with defaults:
Example — create with name and content:

delete_scenario

Tags: workflow Delete a test scenario. Permanently removes the scenario from the workflow. Pass id (required): the workflow UUID, slug, or name, as returned by create_workflow or list_workflows.

edit_scenario

Tags: workflow Make precise text replacements in a scenario’s YAML definition. Use this for small changes like updating expected values or modifying events. The old_string must match exactly (including whitespace and indentation). Pass id (required): the workflow UUID, slug, or name, as returned by create_workflow or list_workflows. Example:

edit_workflow

Tags: workflow Make precise text replacements in the workflow YAML. Use this for small changes like:
  • Adding or modifying a node
  • Updating an edge condition
  • Changing input parameters
The old_string must match exactly (including whitespace and indentation). Include enough context to ensure a unique match. Conflict Detection: If you provide expected_version (from get_workflow), the edit will fail if the workflow was modified since you last viewed it. Draft vs complete: A draft stores the edit even with validation errors. A complete (runnable) workflow must stay valid: an edit that introduces errors is rejected unless you pass complete: false, which saves it as a draft. Pass complete: true to mark it complete once it validates. The response always shows the resulting status and every current error and warning. Parameters:
  • id: (required) Workflow UUID, slug, or name (the id returned by create_workflow, or from list_workflows).
  • old_string: (required) Exact text to replace.
  • new_string: (required) Replacement text.
  • expected_version: (optional) Version number for conflict detection.
  • complete: (optional) true = mark complete, false = save as draft, omitted = keep current status.
Example:

fire_trigger

Tags: workflow, runs Run an existing trigger once now, using its saved workflow, inputs, machine and connections. Never creates, enables or changes a trigger. This is a manual fire: it bypasses enabled and overlap checks, so even a paused trigger may run once without being enabled. It can start real work with the trigger’s saved privileges. Use only when the user asks to run or test that activation. Returns fire_workflow_id: the asynchronous firing was accepted, NOT proof that a run launched or succeeded. Do not retry just because the run is not visible yet: each call starts another fire. Inspect list_trigger_events for this trigger, then get_run with the resulting chat_id.

get_cel_reference

Tags: workflow, readonly Gets the CEL expression reference for workflow development. WHEN TO USE:
  • When writing conditions, args, or dynamic values in workflows
  • To understand available namespaces and their fields
  • To see available custom functions
RETURNS: Complete CEL reference including:
  • All namespaces (inputs, workflow, nodes, iter, output, outputs)
  • Field documentation for each namespace
  • Custom functions (parseJson, coalesce, etc.)
  • Common patterns and examples

get_integration_schema

Tags: workflow, readonly Get the full schema of one integration action (or trigger type) by ref. WHEN TO USE:
  • After search_integrations, before writing a type: action node that uses the ref
  • To learn which keys go in the node’s with: and which are required
  • To learn the output fields reachable as nodes.<id>.data.<field> in later nodes
RETURNS: The description, the params JSON Schema (the node’s with:), the output JSON Schema (nodes.<id>.data), what connecting the integration requires, and whether the user is connected. A trigger type returns its event payload schema (trigger.payload) instead of params and output.

get_preset

Tags: workflow, readonly Gets the full configuration of a preset. WHEN TO USE:
  • To view preset configurations
  • To understand what a preset provides
  • To copy and adapt preset settings
PARAMETERS:
  • name: The preset name (from list_presets)
RETURNS: The complete preset YAML configuration.

get_schema

Tags: workflow, readonly Look up schema documentation for any workflow type by name. WHEN TO USE:
  • When you see a field type like “thread: ThreadConfig” and need details
  • When you need to understand node output structure (e.g., CallLLMOutput)
  • To explore top-level types (Workflow, Edge)
  • To get full field documentation for any type
WHAT YOU CAN QUERY:
  • Node types: call_llm, loop, workflow, run, execute_tools, join, etc.
  • Input types: string, number, boolean, enum, model, message, etc.
  • Config types: ThreadConfig, SaveMessageConfig, ProjectConfig, ResponseTool, etc.
  • Output types: CallLLMOutput, ExecuteToolsOutput, RunOutput, LoopOutput, etc.
  • Top-level: Workflow, Edge, EdgeCase
Type detection is automatic - just provide the name. EXAMPLES:
  • get_schema(name=“call_llm”) // Node type
  • get_schema(name=“ThreadConfig”) // Config type
  • get_schema(name=“CallLLMOutput”) // Output structure
  • get_schema(name=“Workflow”) // Top-level workflow structure
  • get_schema(name=“Edge”) // Edge routing structure

get_workflow

Tags: workflow, readonly Gets the full YAML definition of a workflow. WHEN TO USE:
  • To view the current state of the workflow you’re editing
  • Before making edits to understand the structure
  • To read a builtin or project workflow as a starting point
PARAMETERS:
  • id: (required) Workflow UUID, slug, or name — including a builtin or project workflow name straight out of list_workflows, or the id from create_workflow.
RETURNS: The complete workflow YAML with validation status. For editable drafts it also returns the version and timestamp; pass that version as expected_version to edit_workflow/write_workflow for conflict detection. Builtin and project workflows are read-only and have no version — copy one into create_workflow to get an editable draft.

get_workflow_suggestions

Tags: workflow, readonly Returns static design suggestions for building workflows. WHEN TO USE:
  • Before starting a new workflow design
  • When encountering complexity or unexpected behavior
  • To learn best practices for edges, joins, loops, and conditions
RETURNS: Markdown document with categorized suggestions covering:
  • Structure and organization
  • Edge routing patterns
  • Node vs edge conditions
  • Join behavior with conditional sources
  • Loop patterns and outputs
  • Testing strategies
Note: These are static suggestions. Future calls yield the same results.

list_presets

Tags: workflow, readonly Lists available presets for agent nodes. WHEN TO USE:
  • To discover available presets for agent configurations
  • To find the right preset for a specific task
  • Before using get_preset to view details
RETURNS: List of preset names with descriptions.

list_scenarios

Tags: workflow, readonly List all test scenarios for the current workflow. Returns a summary of each scenario including name, description, and last run status. Use this to see what scenarios exist and their current state. Pass id (required): the workflow UUID, slug, or name, as returned by create_workflow or list_workflows.

list_trigger_events

Tags: workflow, readonly Inspect an existing trigger’s firing history, newest first: event id, time, outcome, detail, launched chat_id and current run state. Read-only; never fires or changes a trigger. Raw event payloads are not returned. Use after fire_trigger to see whether a firing launched, skipped or failed; acceptance of a manual fire is not a successful run. Recording is asynchronous, so an empty page may mean the firing has not been recorded yet. Use get_run with a launched chat_id for details. Concurrent fires can appear: do not assume the newest event necessarily belongs to your call. Match fire_workflow_id from fire_trigger to the event with that exact ID, then use its chat_id; do not guess from ordering. Continue with next_page_token when present.

list_triggers

Tags: workflow, readonly List the user’s triggers: what starts runs without anyone typing — schedules, webhooks, integration events and workflow events — with each one’s health. Narrow by workflow to see a workflow’s activations. Health is HEALTHY, DEGRADED, FAILING (its runs keep failing), UNKNOWN (has not fired) or BROKEN (it activates a declared trigger the workflow no longer has, or one changed in a way it cannot follow — the detail says which; fix the workflow, then the user re-enables it in the app).

list_workflows

Tags: workflow, readonly Lists all available workflows (builtin, project, and user-created). WHEN TO USE:
  • To discover available workflows
  • To find workflow patterns for common use cases
  • Before using get_workflow to view details
RETURNS: A table of workflows with their descriptions and source (builtin, project, or user). User workflows also list their draft UUID; builtin and project workflows have none. Any handle in the Workflow column can be passed straight to get_workflow as id.

run_scenario

Tags: workflow Run an existing test scenario by name. Executes the scenario against the current workflow and returns the results. Use this after making changes to verify scenarios still pass. Use list_scenarios to see available scenario names. Pass id (required): the workflow UUID, slug, or name, as returned by create_workflow or list_workflows.

search_integrations

Tags: workflow, readonly Search the integration catalog for actions a workflow can run (and trigger types that can start one). WHEN TO USE:
  • Before writing a workflow node of type: action: find the ref to put in its uses:
  • To check whether an integration (GitHub, Slack, HTTP, …) can do something
  • To see which integrations the user has already connected
RETURNS: Up to limit refs, best match first, each with a one-line summary and whether the user can use it now (“connected”). A “not connected” action still works in a workflow once the user connects that integration; tell them so. NEXT STEP: Call get_integration_schema with a ref to read its parameters and output before writing the node:
  • id: open_issue type: action uses: github/issue.create@1 # the ref with: { ... } # keys from the params schema
Core workflow nodes (call_llm, run, loop, …) are not integrations; use get_schema for those.

view_scenario

Tags: workflow, readonly View a specific test scenario’s full definition. Returns the complete scenario YAML including events, expectations, and last run results. Use this to examine a scenario’s configuration or debug test failures. Pass id (required): the workflow UUID, slug, or name, as returned by create_workflow or list_workflows.

write_scenario

Tags: workflow Create or update a test scenario with YAML content. Creates or updates a scenario with the given YAML definition and runs it. Scenario YAML structure:
Events — typed mode (usually shorter than a raw output map):
Assertions — all optional:
  • outcome: completed | error | failed
  • reached / not_reached: whether a node was SCHEDULED. reached includes nodes that were skipped or errored, so it does NOT prove a node ran.
  • completed: nodes that must have EXECUTED successfully. This is the assertion that excludes skipped nodes — use it, not reached, to prove a branch ran.
  • skipped: nodes that must have been scheduled but skipped by a false condition.
  • error_contains / error_node: for outcome: error
  • node_outputs: {node_id: {field: expected}} — partial match on a node’s output
  • outputs: {name: expected} — the workflow’s declared outputs. Keys support dotted paths (e.g. “response.choice”: “complete”).
Targeting nodes:
  • Top-level nodes: node: “call_llm”
  • Inner loop nodes: node: “agent_loop.call_llm” (dot-separated)
  • Nested loops: node: “outer_loop.inner_loop.call_llm”
Workflow selection: Pass id (required): the workflow UUID, slug, or name, as returned by create_workflow or list_workflows. Example:

write_workflow

Tags: workflow Replace an existing workflow draft with YAML content. Usage:
The content must be valid workflow YAML with at minimum:
  • name: Workflow name
  • entry: List of entry point node IDs
  • nodes: Array of node definitions
  • edges: Array of edge definitions (optional for single-node workflows)
Draft vs complete: A draft stores the content even with validation errors. A complete (runnable) workflow must stay valid: content with errors is rejected unless you pass complete: false, which saves it as a draft. Pass complete: true to mark it complete once it validates. Parameters:
  • id: (required) Workflow UUID, slug, or name (the id returned by create_workflow, or from list_workflows).
  • name: (optional) Overrides the name in YAML. Used for display name.
  • content: (required) Complete workflow YAML content.
  • expected_version: (optional) Version number for conflict detection.
  • complete: (optional) true = mark complete, false = save as draft, omitted = keep current status.
Response: The resulting status and every current validation error and warning, plus JSON with id, name, slug, status, and created (false for updates). The slug can be used in ref: fields to reference this workflow.

System & Execution

Tools for executing shell commands and managing system processes.

shell_kill

Tags: execution, shell, coding:default Terminates a background process in the current workspace. WORKSPACE SCOPING:
  • Can kill any process in the current workspace, regardless of which chat started it
  • Multiple chats in the same workspace share process visibility
  • This enables coordination: one chat can stop a server started by another
This tool sends a termination signal and gives the process time to clean up. If it doesn’t stop gracefully, it will be forcefully killed. Usage notes:
  • Process IDs are provided when you start a background process with run_in_background: true
  • You can only kill processes that are currently running
  • After killing a process, its output is still available via shell_output
  • Use shell_list to see all running background processes in the workspace
Example:
  1. Start a background process: bash(command=“npm run dev”, run_in_background=true)
  2. Kill the process: shell_kill(process_id=“<id-from-step-1>”)

shell_list

Tags: execution, shell, readonly, coding:plan, coding:default Lists background processes in the current workspace. WORKSPACE SCOPING:
  • Processes are scoped to the current workspace (worktree)
  • Multiple chats in the same workspace share the same process list
  • This enables coordination: one chat can start a server, another can check its status
  • Use shell_output to view output and shell_kill to terminate any workspace process
Usage notes:
  • By default, shows only running processes in the current workspace
  • Use ‘all: true’ to include completed, failed, and killed processes
  • Process IDs can be used with shell_output and shell_kill tools
Example outputs:
  • Running processes: Shows ID, command, and how long they’ve been running
  • Completed processes: Shows ID, command, exit code, and duration
  • Failed processes: Shows ID, command, exit code, and error indication
Examples:
  1. List running processes: shell_list()
  2. List all processes including completed: shell_list(all=true)

shell_output

Tags: execution, shell, readonly, coding:plan, coding:default Retrieves output from a background process with pagination and regex filtering support. WORKSPACE SCOPING:
  • Can read output from any process in the current workspace, regardless of which chat started it
  • Multiple chats in the same workspace share process visibility
  • This enables monitoring: check on servers or builds started by other chats
This tool allows you to check the stdout and stderr output of a process running in the background, with support for reading in chunks to handle large outputs efficiently and filtering with regex. Usage notes:
  • Process IDs are provided when you start a background process with run_in_background: true
  • The tool will indicate if the process is still running or has completed
  • If the process has completed, the exit code will be provided
  • Output is not cleared after reading - you can re-read from any position
MODES OF OPERATION:
  1. Standard Pagination (default):
    • offset: Start reading from byte N (default: 0)
    • limit: Read up to N bytes (default: 16000)
    • Can be combined: offset + limit
  2. Tail Mode:
    • tail: Get last N lines
    • Cannot be combined with: regex, offset, limit
  3. Regex Filter Mode:
    • regex: Filter output to lines matching pattern
    • When set, tool filters FIRST, then applies offset/limit to filtered results
    • Can be combined with: offset, limit, regex_case_insensitive, regex_context_before, regex_context_after
    • Cannot be combined with: tail
    • Optional parameters:
      • regex_case_insensitive: Case-insensitive matching
      • regex_context_before: Include N lines before match (like grep -B)
      • regex_context_after: Include N lines after match (like grep -A)
PARAMETER COMPATIBILITY: Valid combinations:
  • offset + limit (standard pagination)
  • tail (alone)
  • regex (alone)
  • regex + offset + limit (filtered pagination)
  • regex + regex_case_insensitive + regex_context_before + regex_context_after
Invalid combinations (will error):
  • tail + regex
  • tail + offset
  • tail + limit
  • regex_case_insensitive without regex
  • regex_context_before/after without regex
Examples:
  1. Start a background process: bash(command=“npm run dev”, run_in_background=true)
  2. Get first chunk: shell_output(process_id=“<id>”)
  3. Get next chunk: shell_output(process_id=“<id>”, offset=16000)
  4. Get last 100 lines: shell_output(process_id=“<id>”, tail=100)
  5. Filter for errors: shell_output(process_id=“<id>”, regex=“ERROR|FATAL”)
  6. Filter with context: shell_output(process_id=“<id>”, regex=“ERROR”, regex_context_after=3)
  7. Filter and paginate: shell_output(process_id=“<id>”, regex=“WARN”, offset=0, limit=10000)
The response includes metadata:
  • has_more: true if more output is available
  • next_offset: where to start reading for the next chunk
  • total_available: total bytes available in the (filtered or original) output
  • filter_applied: true if regex was used
  • total_matches: number of matching lines (when filtered)
  • matches_in_response: number of matches in this chunk

shell_wait

Tags: execution, shell, readonly, coding:plan, coding:default Block until a background process exits, then return its exit code and recent output. WHY THIS EXISTS: Waiting by running a sleep command is the wrong tool and costs far more than it looks. sleep 300; tail log occupies a whole turn doing nothing, and it frequently exceeds the tool timeout and dies, losing the wait entirely. Polling shell_output in a loop is better but spends a model round-trip on every check. shell_wait blocks server-side: one tool call, no round-trips, no lost work. WHEN TO USE:
  • Waiting for a long build, test suite, or install to finish
  • Any time the next thing you do depends on a background process being done
WHEN NOT TO USE:
  • A long-running server you never expect to exit (use shell_output to check on it)
  • You only want progress so far, not completion (use shell_output)
HOW TO USE:
  1. Start the work in the background: bash(command=“npm test”, run_in_background=true)
  2. Do any useful work that does not depend on the result — read the next file, prepare the following edit. The process runs while you do.
  3. Wait for it: shell_wait(process_id=“<id>”)
TIMEOUTS ARE NOT FAILURES: If the process is still running when the budget elapses, this returns normally with timed_out: true and the process untouched. Call shell_wait again to keep waiting. It never kills the process — use shell_kill for that. Because a single call cannot block past the tool-execution ceiling, a very long build may need a few consecutive shell_wait calls. That is still dramatically cheaper than polling, and unlike a sleep it cannot lose the wait. RETURNS EARLY WHEN A MESSAGE ARRIVES: If a message arrives for you while you wait — from the user, your parent, or a sub-agent — the wait ends early so you can read it; the message follows the result. The process is NOT killed. Call shell_wait again to keep waiting. RETURNS:
  • Exit code and status once the process has exited
  • The last tail_lines lines of output (default 50), so a passing build or a failing test usually needs no follow-up call
  • timed_out: true, with no exit code, if the budget elapsed first
Use shell_output for the full log, for pagination, or for regex filtering.

Other Tools

Miscellaneous tools and utilities.

ask_user

Tags: coding:default, coding:plan Ask the user one or more questions. By default the question is posted to the user (in the chat and their inbox) and the tool returns at once: you keep working. Use this when you want to:
  1. Clarify ambiguous instructions
  2. Get user preferences or decisions
  3. Offer choices about implementation direction
  4. Confirm before taking significant actions
Default (async) — the norm: proceed on a sensible default, usually the option you recommend, and say in the question which one you are going with. If the user answers, the answer arrives later as a message from the user; adjust your work then if it changes anything. Do not wait for it and do not ask the same question again. If your work makes a question moot before it is answered, withdraw it (withdraw_question) so it leaves the user’s inbox. blocking: true — the exception: stop and wait for the answer. Use it only when you truly cannot make progress without it — every reasonable default would be wrong or wasted work, or the next action is significant or hard to undo and needs the user’s go-ahead first. Before asking, call list_pending_questions if you may have asked already: do not ask a question that is still pending. Before finishing, withdraw questions your default made moot. Usage notes:
  • The user will always have an option to provide freetext input in addition to any predefined options.
  • If you recommend a specific option, list it first and add “(Recommended)” to the label.
  • Use allow_multiple: true when choices are not mutually exclusive.
  • Group related questions in a single call (up to 4 questions).

component_library

Tags: readonly, coding:plan Component library with 61 production-ready React/TypeScript components for building UIs, dashboards, landing pages, pitch decks, charts, and diagrams. WHEN TO USE:
  • Building any UI — search for relevant components first
  • Creating charts or diagrams — components handle all coordinate math
  • Building pitch deck slides — use deck components as templates
  • Need a layout pattern — search by use case (dashboard, landing, portal, crm)
  • Building CRUD/admin interfaces — badge, modal, tabs, pagination, toast, etc.
ACTIONS:
  • search: Find components with unified keyword search Examples: search(query=“crud table admin”), search(query=“chart dashboard”), search(tag=“deck”)
  • get: Retrieve full source code for a specific component Example: get(name=“quadrant_chart”)
  • install: Write a component file to disk at the given path Example: install(name=“sidebar_left”, path=“src/components/layouts/sidebar_left.tsx”)
  • list: Browse all components (optionally filtered by tag or category)
CATEGORIES: layouts (11), charts (6), diagrams (5), deck (7), ui (32) TAGS: layout, chart, diagram, deck, ui, landing, marketing, dashboard, analytics, admin, portal, crm, comparison, pricing, hero, form, auth, slide, presentation, saas, funnel, competitive, market, pipeline, process, team, docs, technical, crud, table, stats, detail, search, navigation, modal, dialog, filter, badge, status, tabs, pagination, toast, notification, avatar, dropdown, menu, skeleton, loading, toggle, switch, alert, banner, activity, feed, metric, breadcrumb OPTIONS:
  • forge_integrated: Set to true in forge-generated projects to get integration guidance for useUiStore, useEventBus, and useAuth
CHARTS handle all coordinate math internally — pass data, get pixels. No spatial reasoning required.

control_run

Tags: runs Pause, resume or cancel another top-level run the user owns.
  • pause: park the run at its next step boundary. It stays alive and resumable.
  • resume: continue a paused (or interrupted) run from where it stopped.
  • cancel: hard-stop the run. This is terminal — a cancelled run is not resumed; sending it a message starts a fresh run in the same chat.
THE RECEIPT IS HONEST: pause and cancel REQUEST the stop. A run in the middle of a long tool call stops when that call returns. Confirm with get_run. You cannot control the run you are executing in, and you can only touch runs the user owns. To stop a sub-agent you spawned, use spawn_stop.

generate_image

Tags: media Generate an image from a text description. WHEN TO USE:
  • The user asks for an image, illustration, diagram, icon, logo or mockup.
  • You need a visual asset to write into the project (pair with save_to).
HOW TO USE:
  • Describe the image in detail. Prompt quality dominates the result: name the subject, the style, the composition, the palette, and any text that must appear. A one-line prompt gets a one-line-prompt image.
  • Use size to choose orientation, quality to trade cost for fidelity, and background=transparent for anything that will sit on top of other content.
  • Set save_to to also write the file into the project. Without it the image is still generated and returned; it just is not written to disk.
WHAT YOU GET BACK:
  • The image itself, which you can see and describe or critique.
  • An attachment id. Cite that id when referring to this image later, and pass it to read_attachment to look at it again in a future turn.
CHOOSING A MODEL (set tier; omit it for standard):
  • standard (default): the best everyday image model. Use it for finals.
  • fast: the quicker model, for drafts, thumbnails and quick iterations.
  • To pin one exact model instead, pass model with an id.
  • Ask the user first when cost matters. The result names the model that ran and why; tell the user, and change tier if it was not what they wanted.
  • tier picks WHICH model; quality (below) is how hard that model works.
NOTES:
  • One image per call. Call again to iterate; say what to change rather than repeating the original prompt verbatim.
  • A model or tier the user’s providers cannot serve returns an error naming the tiers that are available.

generate_video

Tags: media Generate a short video clip from a text description. CHOOSING A MODEL (set quality; omit it for standard):
  • standard (default): the everyday choice. A multimodal generalist: best for iterating, editing a previous clip (edit_from), keeping characters consistent with reference images, and physically plausible motion. 3–10s. It RENDERS at 720p; 1080p and 4K are upscaled from that, so they are not truly sharper.
  • cinematic: a polished one-shot final. A dedicated cinematic engine that renders 1080p and 4K NATIVELY, with native audio and the best clean first-pass quality. Pick it when sharpness or a finished look matters. Costs about 4x more than standard, and cannot be edited conversationally (it can only be extended), so each change is a full re-render.
  • fast: drafts and previews. The cheapest tier; no 4K, no reference images.
  • To pin one exact model instead, pass model with an id.
  • Ask the user first when the trade-off matters, for example cost when they want 4K or a long cinematic clip.
  • The result names the model that actually ran and why. Tell the user, and change quality if it was not what they wanted.
COST AND TIME:
  • Costs roughly $0.05 to $0.60 PER SECOND of video, depending on the model and resolution. Resolution defaults to 720p to keep cost down. Prefer short clips.
  • A render takes 30 seconds to several minutes and blocks this turn until it finishes.
HOW TO USE:
  • Describe the subject, the action, the camera and the style. Mention sound or dialogue if you want it.
  • BY DEFAULT THE MODEL CUTS BETWEEN SEVERAL SHOTS and invents a small narrative. Unless the user wants cuts, write “in a single continuous shot, no scene cuts” (or “single unbroken scene”) into the prompt. Without it a request for one moment comes back as a montage.
  • To animate an existing image set start_frame to its attachment id.
  • To refine a clip you already made, pass its edit handle as edit_from and describe ONLY the change (“make it slower, keep everything else the same”). Keep edit prompts short: long, descriptive ones change things you did not ask about. Only models that support edits give you an edit handle; otherwise regenerate with the full prompt.
WHAT YOU GET BACK:
  • Text only. YOU CANNOT SEE THE VIDEO. The user can play it in the chat. Say what you asked for, not what the video shows, and invite them to review it.
  • An attachment id, and an edit handle when the model supports edits.
NOTES:
  • A model or quality the user’s providers cannot serve returns an error naming the tiers that are available.

get_run

Tags: runs, readonly Check on one top-level run: its state, title, workflow, when it was created and last active, and an excerpt of the last thing its agent said. The state is the run’s root workflow: pending, running, paused, completed, failed or cancelled. “completed” means the workflow reached its end, not that the work was right — read the excerpt. Only runs the user owns can be inspected. To check on a sub-agent you spawned, use spawn_status.

github__branch_get

Tags: integration Return one branch: whether it exists, its head commit sha, and whether GitHub treats it as protected (branch protection or a ruleset). A branch that does not exist answers exists false, not an error. Publishing steps read this before pushing, to refuse a protected branch.
Tags: integration Search file contents with GitHub’s code search syntax. Scope the query with a qualifier, repo:owner/name, org:name or user:name; without one it searches every repository the connection can see. language:, path: and extension: narrow it further, for example “ParseDuration repo:golang/go language:go”. Only default branches are indexed, files over 384 KB are not, and GitHub allows about ten code searches a minute, so prefer one precise query over many broad ones.

github__issue_comment

Tags: integration Post a markdown comment on an issue, or on a pull request’s conversation tab (pull requests share the issue comments API; pass the PR number as issue_number). For a review with a verdict, use pr.review.create.

github__issue_comment_list

Tags: integration List the comments on an issue, or on a pull request’s conversation tab (pass the PR number as issue_number), oldest first. Pass since, an ISO 8601 time such as 2026-01-02T03:04:05Z, to get only comments created or edited after it, so a recurring run reads what is new. Follows GitHub’s pagination up to 1000 comments; narrow with since for busier threads. Each comment carries its id, node id, author login and numeric user id. Inline diff comments are listed by pr.review_comments.list and review summaries by pr.reviews.list.

github__issue_comment_update

Tags: integration Edit a comment by id. body REPLACES the whole text, so read the current one first (issue.comment.list) to change part of it. The id is what issue.comment, issue.comment.list or an issue_comment.created event gives; pull request conversation comments are issue comments too. Inline diff comments (on a line of the diff) are a different resource and cannot be edited here. The connection’s account can edit only comments it may edit on GitHub. Returns the comment’s id, node id and URL.

github__issue_create

Tags: integration Open an issue in owner/repo with a title and optional markdown body, labels and assignees. Labels that do not exist are created; an assignee without access to the repository fails validation. Returns the issue number, id, node id and URL.

github__issue_get

Tags: integration Return one issue: title, body, state, author, labels, assignees and timestamps. Pull requests are issues too; is_pull_request says which.

github__issue_labels_add

Tags: integration Add a single label to an issue or pull request. This is one request that GitHub applies on its own, so it cannot overwrite a label someone else added at the same moment; issue.update with labels replaces the whole list and can. A label that does not exist in the repository is created; adding one the issue already has changes nothing. Returns the issue’s labels after the change.

github__issue_labels_remove

Tags: integration Remove a single label from an issue or pull request. This is one request that GitHub applies on its own, so it cannot drop a label someone else added at the same moment; issue.update with labels replaces the whole list and can. The label stays in the repository. If the issue does not carry the label GitHub answers 404, and so does this action: a not found here can mean the label was already removed. Returns the issue’s labels after the change.
Tags: integration Search issues and pull requests with GitHub’s search syntax. Scope the query with repo:owner/name (or org:, user:) and narrow it with is:issue, is:pr, is:open, is:closed, label:“name”, author:, in:title,body, or a quoted phrase, for example repo:acme/app is:open “autopilot:marker”. Each hit says whether it is a pull request. Returns one page; ask for the next with page. GitHub returns at most the first 1,000 matches, indexes new items with a short delay, and allows about thirty searches a minute.

github__issue_update

Tags: integration Edit an issue (or a pull request’s issue fields). Only the fields you pass change; pass at least one. labels and assignees REPLACE the current set; pass an empty list to clear them. Close with state closed and an optional state_reason.

github__labels_create

Tags: integration Create a label in a repository with a name, a six-digit hex color and an optional description. It is safe to run again: when the repository already has a label of that name (matched without regard to case) nothing is changed, not even its color or description, and the result says created is false. A setup step can therefore ensure its labels exist every time it runs. Creating a label needs write access to the repository. Returns the label’s name, color and description as they are on GitHub when it was just created.

github__labels_list

Tags: integration List the labels defined in a repository (not the labels on one issue), following GitHub’s pagination up to 1000 labels. Use it to check which of a set of labels already exist.

github__pr_create

Tags: integration Open a pull request merging head into base. The head branch must already be pushed (from a workspace, or created through GitHub). head is a branch name, or owner:branch for a branch in a fork. A pull request cannot be created with labels in the same request; add them afterwards with issue.labels.add using the returned number. GitHub answers 422 when the branches are identical, have no commits between them, or a pull request for them is already open; the message says which. Merging is not an action here: a person merges. Returns the pull request’s number, id, node id and URL.

github__pr_get

Tags: integration Return one pull request: title, body, state, draft and merged flags, the head and base refs (branch, sha, repository) and mergeability. mergeable is null while GitHub is still computing it; read again shortly. mergeable_state is GitHub’s summary (clean, dirty, blocked, behind, unstable, unknown, …).

github__pr_list_files

Tags: integration List the files a pull request changes: filename, status (added, modified, removed, renamed, …), line counts and the unified diff hunk (patch). patch is null for binary files and very large diffs. Follows GitHub’s pagination up to 1000 files; GitHub itself caps the list at 3000.

github__pr_review_comment_reply

Tags: integration Post a reply to an inline review comment, in the same thread. comment_id is the id of a comment in the thread (pr.review_comments.list, or a pull_request_review_comment.created event); GitHub does not nest replies, so replying to a reply lands in the same thread. To start a new thread, or for a conversation-tab comment, use pr.review.create or issue.comment. Returns the reply’s id, node id and URL.

github__pr_review_comments_list

Tags: integration List the inline review comments on a pull request: comments attached to a line of the diff, including replies, oldest first. Each carries the file path, line, the diff hunk it points at, the review it belongs to (review_id) and, for a reply, the comment it answers (in_reply_to_id; reply to a thread by passing its first comment’s id to pr.review_comment.reply). Pass since, an ISO 8601 time, to get only comments created or edited after it. Follows GitHub’s pagination up to 1000 comments. line is null when the commented line is no longer in the diff (the comment is outdated); original_line is where it was.

github__pr_review_create

Tags: integration Submit a review on a pull request with a verdict: COMMENT (the default), APPROVE, or REQUEST_CHANGES. body is required for COMMENT and REQUEST_CHANGES. The review is submitted immediately, never left pending. Pass commit_id to pin the review to the commit you read (pr.get head.sha); otherwise GitHub uses the latest commit.

github__pr_reviews_list

Tags: integration List the reviews on a pull request, oldest first: who reviewed, the verdict (APPROVED, CHANGES_REQUESTED, COMMENTED, DISMISSED or PENDING), the summary text, and the commit reviewed. Pending reviews are visible only to their author. The comments inside a review are listed by pr.review_comments.list (match on review_id). Follows GitHub’s pagination up to 1000 reviews.

github__pr_update

Tags: integration Edit a pull request. Only the fields you pass change; pass at least one. state closed closes it without merging and open reopens it. Changing base retargets the pull request to another branch. Labels and assignees are changed through issue.labels.add, issue.labels.remove and issue.update, since a pull request is an issue too. Merging is not an action here: a person merges. Returns the pull request’s number, id, node id and URL.

github__repo_get

Tags: integration Return one repository: full name, description, visibility, default branch, primary language, topics, and whether the connection can push. Read default_branch before browsing code on a branch nobody named.

github__repo_get_content

Tags: integration Read one path in a repository through GitHub, with no checkout. For a file, content is its text. A binary file has binary true and no content; a file over 1 MB has too_large true and no content. For a directory, entries lists what it holds, one level deep (repo.get_tree lists everything). Omit path for the repository root and ref for the default branch. Results longer than about 30,000 characters are cut short.

github__repo_get_tree

Tags: integration List the repository’s files recursively from its git tree, with no checkout: each entry’s full path, type (blob is a file, tree a directory, commit a submodule) and size. Pass path to list only one directory, which a large repository needs: results longer than about 30,000 characters are cut short. truncated is true when the tree is larger than GitHub returns at once (100,000 entries). Omit ref for the default branch.

github__repo_list_for_user

Tags: integration List the repositories the connected user can access (owned, collaborator, and through organization membership), following pagination up to 1000. With the hosted GitHub App, actions still only reach repositories the App is installed on. can_push says whether the user can write.

github__user_get

Tags: integration Return the GitHub user the connection authenticates as: login, id, name and profile URL.

github__workflow_dispatch

Tags: integration Start a GitHub Actions workflow run on a branch or tag. The workflow file must declare on: workflow_dispatch, and inputs must match its declared inputs (at most 25, all passed as strings). workflow is the workflow file name (deploy.yml) or its numeric id. Returns the run id and URL when GitHub reports them.

gmail__label_list

Tags: integration List the mailbox’s labels: system labels (INBOX, SENT, UNREAD, STARRED, IMPORTANT, CATEGORY_*) and the user’s own, with the id Search email’s label_ids and a trigger’s label_ids attribute use.

gmail__message_get

Tags: integration Read a message by id. format full (the default) decodes the body into text (and html when the message has an HTML part) and lists attachments by name; metadata returns only headers, labels and the snippet, which is cheaper and avoids pulling a large body. Headers are flattened into from, to, cc, subject, date and message_id (the Message-ID a reply’s in_reply_to takes).

gmail__message_list

Tags: integration List message ids in the mailbox, newest first, matching q (Gmail’s search box syntax: “from:ann is:unread newer_than:2d”, “subject:invoice has:attachment”) and/or labels (all must match; INBOX, UNREAD, STARRED, or a label id from List labels). Returns ids and thread ids only; read a message with Get email. Follows Gmail’s paging up to max_results.

gmail__message_send

Tags: integration Send an email as the connected Google account. Give to (and optionally cc and bcc) as addresses, a subject, and a body as plain text, HTML or both. To reply, pass the original message’s thread_id and its Message-ID header as in_reply_to (and references when the thread has several), and keep its subject (“Re: ” is added if missing): Gmail only threads a reply whose headers and subject match. Returns the sent message’s id and thread_id.

http__request

Tags: integration Send an HTTP request to a public http(s) URL and return the status, headers and body. Private, loopback and link-local addresses are refused.

list_pending_questions

Tags: readonly List the questions you and your sub-agents have asked the user (ask_user) that are still unanswered. Shows your own thread’s questions and those of every sub-agent below you, recursively — never a sibling’s. For each: question_id, who asked (you, or the sub-agent’s agent_id and title), whether it is async (asked without waiting — nobody is blocked on it) or blocking (that agent is parked until the user answers), the question and its options, and how long it has been waiting. When to call it:
  • Before you finish a task: check for async questions still unanswered. If you went ahead on a default and the answer no longer matters, withdraw it with withdraw_question so it leaves the user’s inbox. If it still matters, say so in your final answer.
  • Before asking the user something: avoid asking a question that is already pending.
Answers to async questions arrive as messages from the user that name the question_id, so you can match an answer to the question it came from.

list_runs

Tags: runs, readonly List the user’s recent top-level runs (chats), most recently active first, with the state of each run’s root workflow. These are detached runs — the ones start_run creates and the ones the user starts themselves — not your own sub-agents (spawn_status lists those). Archived chats are not shown. Each entry has the run id (use it with get_run, control_run and send_to_run), title, workflow, project and state: pending, running, paused, completed, failed or cancelled. The run you are executing in is marked.

load_tool

Tags: coding:default, readonly, coding:plan Dynamically load a tool by name or search for available tools. Use this when you need a tool that isn’t currently loaded. You can:
  • Load a specific tool by name: {"name": "sourcegraph"}
  • Load every tool carrying a tag in one call: {"name": "tag:workflow"} (each tool is still individually checked against what this agent may load)
  • Search for tools by keyword or tag name: {"query": "workflow"}
Loaded tools become available immediately on the next turn.

metadata_writer

Writes and updates project metadata YAML file

report_bug

Tags: readonly, coding:plan, coding:default Report a defect in Reliant itself, or in forge, to the Reliant engineering team. One call files it; there is nothing to follow up. Use it when the product misbehaves, not the user’s code:
  • reliant: a tool returns wrong or broken output, a message reaches you truncated or garbled (e.g. “[content trimmed]”), the daemon, workspace or working directory vanishes, a chat or sub-agent is stuck or cannot resume, the UI shows something wrong.
  • forge: a forge command fails, hangs or generates something wrong, or a forge lint, skill or doc is wrong.
Do not use it for bugs in the user’s own application, for test or build failures in their code, or for your own mistakes. File each defect once: a repeat in this chat returns the first report’s id. Put what you observed in evidence — exact commands, error text, file paths, ids — never credentials or the user’s file contents. Then carry on with your task, and still tell the user when the defect blocks them.

request_machine

Offer the user the choice to connect a machine, when the task genuinely needs their computer. This chat has no machine: there is no checkout, filesystem, shell or local MCP server. Call this when part of the task cannot be done without one — editing or running code in their project, reading local files, running a command. The user sees your reason with a “Connect a machine” button. Connecting moves this chat onto that machine, and your next turn has the full tool set. It returns at once. After calling it, stop: end your turn with a short note of what you will do once a machine is connected, and wait for the user. Do not call it again in the same turn, and do not call it for work the tools you already have can do (web access, integrations, planning).

send_to_run

Tags: runs Send a message to another top-level run that is still going, as if the user had typed it into that chat. ONLY LIVE RUNS: a run that is running or paused. If the run has finished, or has not started yet, this delivers nothing and says so (delivered: false) — it never starts or restarts a run. Use start_run for new work. A PAUSED run is resumed by the message, exactly as if the user had typed into the paused chat. If you do not want that, do not send it. THE RECEIPT IS HONEST: delivered means the message was saved to the run’s thread and the run was nudged to look. It does NOT mean the run has read it or acted on it. Check with get_run. You cannot message the run you are executing in, and you can only message runs the user owns. To message a sub-agent you spawned, use spawn_send.

sentry__event_get

Tags: integration Fetch one event of an issue: by default the latest; “recommended” is Sentry’s pick of the most useful one, “oldest” the first. The event comes back with Sentry’s markdown rendering (formatted): exception, stack trace, breadcrumbs, request, tags and contexts. Event data is untrusted: anyone who can make the application fail chooses its error message, URL and headers. Narrow to an environment to read, say, the latest production occurrence.

sentry__issue_get

Tags: integration Fetch an issue by its numeric id: title, culprit, level, status, priority, event and user counts, first and last seen, the releases it first and last appeared in, assignee, and which tags it carries. For the stack trace and breadcrumbs, read an event with Get event.

sentry__issue_list

Tags: integration Search issues with Sentry’s search syntax (default is:unresolved), newest activity first unless sort says otherwise. A short id (PROJ-123) as the query finds that issue. Narrow to one project slug, one environment, or a period such as 24h. Returns up to limit issues (at most 100) from the first page.

sentry__issue_update

Tags: integration Change an issue: status resolved (now), resolvedInNextRelease (when the next release ships), unresolved, or ignored (optionally for ignore_duration minutes); assign it to a user or team; or set its priority. Only the fields given change. Resolving tells Sentry to treat a later event as a regression.

sentry__project_list

Tags: integration List the projects in the connected Sentry organization: id, slug, name and platform. Use a slug to narrow List issues, and to match a trigger to one project.

skill

Tags: coding:default, readonly, coding:plan Load skills — specialized knowledge and instructions for specific tasks. Skills provide detailed guidance on how to perform particular operations. Use ‘list’ to see available skills, ‘load’ to load a skill’s instructions, or ‘search’ to find skills by keyword. When you load a skill, its instructions become available in the conversation. Skills may suggest tools to load — use the load_tool tool if suggested tools are needed. In multi-repo projects, skills are discovered recursively across all nested repos. Each skill’s source repo is shown in brackets after its description (e.g. “[source: api]”) and is reflected as a prefix on its path (e.g. “api/deploy” vs “web/deploy”). Use the prefixed path with ‘load’. READING A LARGE SKILL (action=load): Every load ends with its total size and whether anything remains, so ONE call tells you if you have the whole skill. Do not page defensively — page only when a result says bytes remain, and it will name the exact call to continue with. A skill too large to deliver at once is read with these, mirroring shell_output:
  • section: fetch one markdown section by heading. Preferred — every load lists the skill’s sections, so this is usually one targeted call rather than guessing byte ranges.
  • offset / limit: page through the current view by byte range.
  • regex (+ regex_case_insensitive, regex_context_before, regex_context_after): deliver only matching lines, numbered, to locate content before fetching it.
Examples: skill(action=“load”, path=“db”) whole skill + size report skill(action=“load”, path=“db”, section=“Seeding”) one section skill(action=“load”, path=“db”, offset=23000) continue where a window ended skill(action=“load”, path=“db”, regex=“foreign key”) find the relevant part first

slack__conversations_history

Tags: integration Read messages from a channel the bot is a member of, newest first, optionally between oldest and latest (ts values). limit bounds the page size; up to max_pages pages are followed. Thread replies are not included, only the thread’s parent with its reply_count.

slack__conversations_list

Tags: integration List the workspace’s conversations: public channels, and private channels the bot is a member of. Returns each channel’s ID (what every other action takes), name, and whether the bot is a member — it can only post to and read channels it is in. Follows Slack’s cursor pagination.

slack__message_post

Tags: integration Post a message as the Reliant bot to a channel or DM by its ID. Give text, Block Kit blocks, or both (text is then the notification fallback). Set thread_ts to post inside a thread. The bot must be a member of the channel. Returns the message’s ts, which identifies it for updates, replies and reactions.

slack__message_reply

Tags: integration Post a reply in the thread of an existing message, identified by its channel and ts (a reply to a reply goes to the same thread). Set reply_broadcast to also show it in the channel.

slack__message_update

Tags: integration Replace the text and/or blocks of a message the Reliant bot posted, identified by channel and ts. A bot can only edit its own messages (cant_update_message otherwise).

slack__reaction_add

Tags: integration Add an emoji reaction, as the bot, to the message at channel + ts. Name the emoji without colons (“thumbsup”, “white_check_mark”). Reacting twice with one emoji fails with already_reacted.

slack__user_lookup_by_email

Tags: integration Look up a member of the workspace by email address and return their user ID (for mentions as <@ID> and DMs), names and timezone. An address with no member is users_not_found.

spawn_send

Send a message to a running sub-agent you spawned, or to your own parent agent. THE RECEIPT IS HONEST — READ IT LITERALLY: This QUEUES the message for delivery at the target’s next turn. It does NOT mean the target has read it, and it does NOT mean the target has acted on it. Do not proceed as though your instruction has already taken effect — if you need to know whether it landed, check back with spawn_status or wait for a response. v1 is parent ↔ child only: you may message a direct sub-agent (a spawn of this thread) or your own parent. Messaging a sibling or unrelated agent is rejected. A sub-agent of yours that stopped on an error is not finished: your message resumes it where it stopped, and it reads the message at its first turn. If the target has finished (completed, or stopped by the user), this FAILS rather than silently doing nothing — use spawn(agent_id=…) to resume it instead.

spawn_status

Tags: readonly Check on the sub-agents you (the calling thread) have spawned — list them all, or inspect and optionally wait on one. WORKSPACE SCOPING:
  • Only shows/waits on agents YOU spawned (your direct children), never a sibling’s or another thread’s sub-agents.
  • Exception: if this chat was BRANCHED from a conversation that had already spawned agents, those are listed too, marked “Inherited … (read-only)”. You can inspect them (agent_id without wait), but they still belong to the original conversation: their results are delivered there, and only it can wait on, message, or stop them.
TWO MODES:
  1. LISTING (omit agent_id): returns every sub-agent you spawned — agent_id, title, preset, status, elapsed time, last activity time, turn count, and whether it appears gated on a question or approval (best-effort — this signal can be unavailable and is never a hard guarantee).
  2. SINGLE AGENT (agent_id set): returns that agent’s status and its LAST ASSISTANT MESSAGE — “is it done, and what did it say?” without cancelling it.
WAITING: Set wait: true with agent_id to block server-side until that agent reaches a terminal state (completed/failed/cancelled/expired), instead of polling this tool yourself. One call, no round-trips, no lost work — the same shape as shell_wait. TIMEOUTS ARE NOT FAILURES: If the agent is still running when the budget elapses, this returns normally with timed_out: true and the agent untouched. Call spawn_status again with wait: true to keep waiting. RETURNS EARLY WHEN A MESSAGE ARRIVES: If a message arrives for you while you wait — from the user, your parent, or ANY of your sub-agents finishing or reporting — the wait ends early so you can read it; the message follows the result. The agent you were waiting on is NOT stopped. Call spawn_status with wait: true again to keep waiting. Use spawn_send to message an agent that is still running.

spawn_stop

Stop a sub-agent you spawned, when its work is no longer needed. THE RECEIPT IS HONEST — READ IT LITERALLY: This REQUESTS the stop. The agent is not dead when this returns. A spawn runs as a cooperative loop and observes the cancellation at its NEXT STEP BOUNDARY, so an agent in the middle of a long tool call — a build, a test run, a wait — keeps going until that call returns. Do not treat the work it was doing as already abandoned. To confirm it actually stopped, call spawn_status(agent_id=…, wait: true). That blocks until the agent reaches a terminal state, and is the only thing that tells you the stop LANDED rather than that it was asked for. Only a DIRECT sub-agent of yours can be stopped. Your parent, your siblings and unrelated agents are rejected — stopping something you did not start is not yours to decide. If the agent has already finished this reports that and does nothing: a finished agent has no loop left to stop, and its result (if any) still stands. Reach for this when a fan-out has already answered the question, when you have changed approach and the delegated work is now wrong, or when an agent is clearly stuck. Prefer spawn_send to REDIRECT an agent whose work is still useful — stopping discards everything it has not reported yet.

start_run

Tags: runs Start a NEW top-level run — a separate chat the user can open and watch — and return immediately with its ids. This is not a sub-agent. A sub-agent (the agent tool) runs inside YOUR execution and reports back to you; a run started here is detached: it has its own chat, its own workflow and its own lifetime, and it keeps going whether or not you do. Use it for standing or parallel work that should outlive this conversation. Use the agent tool for work you need the answer to. The run belongs to the user, who can see it in the sidebar and stop it. It is NOT unattended: if it asks a question, it waits for the human. RETURNS the new chat id (also its run id for list_runs, get_run, control_run and send_to_run). The run is started, not finished — check on it with get_run. Calling this again with the same tool call (a retry) attaches to the run already started instead of starting a second one. LIMITS: an agent-started run may start further runs, but only 3 levels deep, and the user may have at most 10 agent-started runs live at once. Past either limit this fails; finish or cancel something first.

twilio__message_get

Tags: integration Fetch a message by its SID: its current status (queued → sent → delivered, or failed/undelivered with error_code), body, addresses and price. Use it to check whether a message you sent was delivered.

twilio__message_list

Tags: integration List the account’s messages, newest first, optionally only those to or from one address (E.164, or whatsapp:+… for WhatsApp) or sent on, before or after a date (YYYY-MM-DD). page_size bounds each page; up to max_pages pages are followed.

twilio__message_send

Tags: integration Send a message from one of your Twilio senders. For SMS give E.164 numbers (+15551234567); for WhatsApp prefix BOTH to and from with “whatsapp:”. Send from a number (from) or a Messaging Service (messaging_service_sid). Give body text, media_url, or both. WhatsApp only allows free-form text within 24 hours of the person’s last message; outside that window send an approved template with content_sid (and content_variables) instead of body. Returns the message sid and its initial status (queued or accepted); delivery happens after.

twilio__phone_number_list

Tags: integration List the phone numbers the account owns, with what each can do (sms, mms, voice) and where its incoming messages are sent today (sms_url). Each number whose messages should start a workflow needs its “A message comes in” webhook set to Reliant’s Twilio URL (shown on the trigger). WhatsApp senders are managed separately and are not listed here.

wait_for_machine

Tags: readonly, coding:plan, coding:default Wait for this run’s machine to reconnect, then return so you can retry. WHEN TO USE: A machine tool (shell, view, edit, …) just failed because the machine this run works on is not connected. Do NOT end your turn over it, and do NOT retry the failed call in a loop — call wait_for_machine once, then retry the call that failed. WHEN NOT TO USE:
  • The tool failed for some other reason (bad arguments, a command that exited non-zero). Only a machine that is not connected is worth waiting on.
  • To start, wake or restart the machine. This never does — it only watches.
HOW IT WORKS: It checks every couple of seconds and returns the moment the machine is connected. If the budget elapses first it returns normally, saying what state the machine is in; that is not an error, and calling again keeps waiting. If it reports that the machine was removed or failed to start, waiting will not help: tell the user what happened and stop. RETURNS EARLY WHEN A MESSAGE ARRIVES: If a message arrives for you while you wait — from the user, your parent, or a sub-agent — the wait ends early so you can read it. Nothing is lost; call wait_for_machine again if you still need the machine. RETURNS:
  • connected: true once the machine is attached — retry the call that failed
  • otherwise its last known state (disconnected, starting, suspended, failed, removed) with what to do about it

withdraw_question

Withdraw an async question (an ask_user call without blocking: true) that you or one of your sub-agents asked and that no longer needs an answer — typically because you proceeded on a default and the outcome is settled. Withdrawing closes the question: it leaves the user’s inbox and its card in the chat shows “Withdrawn: <reason>”. The reason is shown to the user, so make it a short, plain sentence (e.g. “Went with Postgres; the schema is already migrated”). Only async questions can be withdrawn, and only those in your own thread or a sub-agent’s below you. A blocking question cannot be: its agent is waiting on the user’s answer, and only the user (or that agent finishing) can close it. Find question ids with list_pending_questions.

worktree

Create and manage worktrees: isolated workspaces for working on a separate branch. Prefer this to running “git worktree add” yourself: a checkout made by hand is invisible to Reliant — the user cannot open a chat on it, nothing locks or cleans it up — and one placed beside the repository litters the project folder. If the user’s or project’s memory (reliant.md) says where worktrees go, follow that instead. A worktree made here is the same workspace the “new worktree” button in the Reliant UI makes. It lives at ~/.reliant/worktrees/<project>/<name>-<id>/ and holds one checkout per repository of the project (laid out like the project itself), each on its own branch. It appears in the Reliant sidebar. ACTIONS:
  1. create - Required: name. Optional: branch, base_branch, copy_files, force Returns the worktree id, the workspace root path, the branch, and the path of each repository’s checkout. The name must be unique among the project’s live worktrees; an archived (deleted) worktree’s name can be reused.
  2. list - List the project’s worktrees (any state: creating, active, failed)
  3. get - Required: name. Details, paths and owner of one worktree
  4. delete - Required: name. Archives the worktree; its directory is removed later, only when it is clean, its work is pushed or already merged, and it is unused. Refuses your own current worktree and any worktree a chat is using.
WORKING IN A WORKTREE:
  • Pass its name to spawn: spawn(worktree=<name>) runs the sub-agent inside it, so its shell and file tools work on that branch.
  • Or use the absolute paths from the result with commands that take a path (cd <path> && …).
  • Commit and push from inside the worktree; each repository’s checkout is on its own branch.
FILE COPYING:
  • copy_files: exact paths relative to the project root, for gitignored files a fresh checkout lacks (the new worktree mirrors the project’s layout)
  • Nothing is searched for: “.env” copies only the root .env; name “frontend/.env” to copy that one
  • A directory is copied whole (e.g. “web/node_modules”); a missing path is skipped
  • When you are working inside a worktree, files are copied from that worktree
WORKFLOW DATA:
  • Result fields are stored in CEL context as ‘worktree_data’: id, name, path, branch, base_branch, project_id, status, session_id, checkouts
EXAMPLE: