The cases where naming the exact tool beats describing the outcome.
Claude Code exposes a few dozen tools, and most of the time you should never name one. You say what you want ("find every place we validate emails", "build it and run it") and the model routes the request to the right tool. That default is good, and you should lean on it.
But routing is the model’s guess at your intent, and sometimes the guess isn’t what you wanted. It answers when you wanted to be asked. It presses on when you wanted a checkpoint. It skips the task list you wanted kept. It improvises three shell commands when you wanted one specific search. In those moments the fix is the same: stop describing the outcome and name the tool. Saying "use the AskUserQuestion tool" or "use TaskCreate" or "use Monitor" turns a guess into a guarantee.
This article is about those moments, the legitimate cases where naming the tool gives you deterministic control, followed by a full, typed reference so you know exactly what to say and with which arguments.
The model is a good dispatcher. Tell it what you want and it walks to the toolbox, picks a tool, and uses it. Ninety percent of the time that is exactly right, and you should let it drive. But a dispatcher is guessing at your intent, and every so often you want to reach past it and grab a specific tool yourself. That reach is the whole skill this article teaches: knowing the names well enough to ask for one on purpose.
pattern=’validateAuth’, output_mode=’content’." You pick the tool and, optionally, its exact arguments. Best when the specific behavior matters more than the outcome.Switch to by-name when any of these is true: you want a specific mechanism (this tool, not a substitute), you want a behavior the model wouldn’t trigger on its own, or the tool is keyword-gated and has no other way in.
AskUserQuestionHere is a fun one to try right now. Prompt the model with:
"Use the AskUserQuestion tool and present me three color choices."
It pops a little structured menu, red / green / blue, and waits for you to pick. Nothing about choosing a color needs a tool, which is exactly why it makes such a clean demo: you aren’t asking for an outcome, you are commandeering a specific piece of UI on demand. The model is smart enough to reach for this tool on its own, but here you are the one deciding it should.
Now swap the toy for something real:
"Use the AskUserQuestion tool to give me options before you choose the auth library."
Same move, real stakes. You convert "the model decided" into "the model asked." This is the single most useful by-name habit to build.
TaskCreate / TaskUpdateThe todo system auto-engages on big, multi-step work, but for a two- or three-step job it may not bother. When you want a durable, visible checklist regardless of the model’s judgment:
"Use TaskCreate to add a task:
subject=’Migrate auth to OAuth’. Then keep it updated as you go." "Use TaskUpdatetaskId=2,addBlockedBy=[‘1’] so task 2 waits for task 1."
Naming TaskCreate makes the task exist on purpose; naming TaskUpdate lets you drive status and dependencies by hand instead of hoping they’re tracked.
CronCreate, Monitor, /loop"Keep an eye on the build" is ambiguous; the mechanism you actually want isn’t. Name it, and you choose polling vs. streaming vs. self-pacing:
"Use CronCreate
cron=’*/15 * * * *’ to re-run the tests every 15 minutes." "Use Monitorcommand=’tail -f dev.log | grep –line-buffered ERROR’ to tell me every time an error appears." "/loop 5m /babysit-prs" to run a prompt on an interval.
Some tools cannot be summoned any other way. Here the name or keyword is the API:
EnterWorktree: "do this in a worktree."Workflow: deliberate multi-agent orchestration.ScheduleWakeup: model-paced loops.ReportFindings: typed findings to the UI.No amount of outcome phrasing unlocks these; the deliberate keyword is the point. They can spawn many agents or relocate your edits, so they wait for explicit consent.
Grep, Glob, Edit, AgentWhen you want one specific mechanism and no substitution:
"Use Grep with
pattern=’TODO’,output_mode=’content’,-n=true" (not a subagent). "Use an Explore agent to search, don’t grep inline." "Use Edit onconfig.tswithreplace_all=true."
Naming removes the routing guess when the how matters as much as the what.
SkillSkills are packaged multi-step procedures. Naming one runs that procedure rather than hoping the model reconstructs the same steps:
"Use the deep-research skill on X", or type
/deep-research <question>.
Artifact, PushNotification, WebFetchWhen you want a specific destination for the result:
"Make an Artifact I can share." / "Use PushNotification to ping me when the build finishes." / "Use WebFetch
url=…prompt=’what changed in 2.1?’."
Two levels of precision:
subject=’…’, description=’…’, activeForm=’…’." You pin the exact call.The rest of this article is the reference that makes the second form possible: every tool, its parameters, types, and defaults.
The reference is the full toolset of a Claude Code 2.1.223 session (Windows, August 2026): 32 tools, 13 always-loaded and 19 deferred. Always-loaded tools are callable immediately; deferred tools are announced by name and their schemas load on demand (the model pulls one in with a ToolSearch call before first use). Parameters are marked * when required, with types and defaults noted.
file_path* string (absolute) · offset int · limit int · pages string (PDF range)file_path* string · content* stringfile_path* string · old_string* string · new_string* string · replace_all bool=falsepattern* string · path stringpattern* string · path · glob · type · output_mode content|files_with_matches|count · -i/-n/-o bool · -A/-B/-C int · multiline bool · head_limit int=250 · offset intcommand* string · description · timeout ms=120000 (max 600000) · run_in_background bool · dangerouslyDisableSandbox boolcommand* string · description · timeout ms (max 600000) · run_in_background bool · dangerouslyDisableSandbox boolnotebook_path* string · new_source* string · cell_id string · cell_type code|markdown · edit_mode replace|insert|delete (default replace)description* string (3 to 5 words) · prompt* string · subagent_type string · model sonnet|opus|haiku|fable · isolation worktree|remote · run_in_background bool=truesubagent_type values: claude, general-purpose, Explore, Plan, statusline-setup.main.
to* string (teammate name, or "main") · message* string · summary string (<=200, required when message is a string)script string · scriptPath string · name string · args any · resumeFromRunId (wf_…)pending).
subject* string · description* string · activeForm string · metadata objecttaskId* string · status pending|in_progress|completed|deleted · addBlockedBy[] · addBlocks[] · owner · subject · description · activeForm · metadatataskId* stringtask_id string (also name@team or a bare agent name) · shell_id (deprecated)task_id* string · block bool=true · timeout ms=30000 (max 600000)cron* string · prompt* string · recurring bool=true · durable (no effect)id* stringdescription* string · timeout_ms* number=300000 (max 3600000) · persistent* bool=false · command string or ws {url* string, protocols[]} (mutually exclusive)/schedule).
action* list|get|create|update|run · trigger_id string · body object (required for create/update)delaySeconds number (60 to 3600) · prompt string · reason string · stop boolurl* uri · prompt* stringquery* string (min 2) · allowed_domains[] · blocked_domains[]message* string (<200 chars) · status* const "proactive"questions[]* where each has: question string, header string (<=12), options[] (2 to 4: label, description, preview), multiSelect boolname string (<=64) or path string, mutually exclusiveaction* keep|remove · discard_changes bool (true to remove a dirty worktree)finalize_plan, then write.
method* list_projects|get_project|list_files|get_file|finalize_plan|write_files|delete_files|register_assets|unregister_assets|create_project|report_validate · plus projectId, planId, path/paths[], writes[]/deletes[], localDir, files[], assets[], nameskill* string (exact name, no leading slash) · args stringfindings[]* where each has: file, summary, failure_scenario*, line, category, short_summary, verdict, outcome · level low|medium|high|xhigh|maxfile_path string · favicon emoji (required to publish) · title · description · url (update) · action publish|listquery* string (select:A,B, keywords, or +name term) · max_results* number=5Loaded = always-on; Deferred = schema loads on demand. * = required.
| Tool | Loaded | Purpose | Key arguments |
|---|---|---|---|
| Read | always | read file / image / PDF / notebook | file_path*, offset, limit, pages |
| Write | always | create / overwrite a Read file | file_path, content |
| Edit | always | exact string replacement | file_path, old_string, new_string*, replace_all |
| Glob | always | filename pattern match | pattern*, path |
| Grep | always | ripgrep content search | pattern*, path, glob, type, output_mode, -i/-n/-o, -A/-B/-C, multiline, head_limit |
| Bash | always | POSIX shell | command*, timeout, run_in_background |
| PowerShell | always (Windows) | pwsh shell | command*, timeout, run_in_background |
| NotebookEdit | deferred | edit one Jupyter cell | notebook_path, new_source, cell_id, cell_type, edit_mode |
| Agent | always | spawn a subagent | description, prompt, subagent_type, model, isolation, run_in_background |
| SendMessage | deferred | agent-to-agent message | to, message, summary |
| Workflow | always (gated: ultracode) | multi-agent orchestration script | script / scriptPath / name, args |
| TaskCreate/List/Get/Update | deferred | todo tracking and dependencies | subject/description; taskId; status, addBlockedBy/addBlocks |
| TaskStop | deferred | kill background task / agent | task_id |
| TaskOutput | deferred (deprecated) | read a background job’s output | task_id*, block, timeout |
| CronCreate/List/Delete | deferred | in-session scheduled prompts | cron, prompt, recurring; id* |
| Monitor | deferred | stream events from logs / cmds / WebSockets | description, timeout_ms, persistent*, command | ws |
| RemoteTrigger | deferred | cloud routines (/schedule) |
action*, trigger_id, body |
| ScheduleWakeup | always (gated: /loop) |
self-paced loops | delaySeconds, prompt, reason, stop |
| WebFetch / WebSearch | deferred | fetch a URL / web search | url+prompt; query* |
| PushNotification | deferred | desktop / phone ping | message, status |
| AskUserQuestion | interactive | structured question to the user | questions[]* |
| EnterPlanMode / ExitPlanMode | interactive | read-only planning and approval | (none) |
| EnterWorktree / ExitWorktree | deferred (gated: worktree) | isolated git worktree | name | path; action*, discard_changes |
| DesignSync | deferred | claude.ai design-system read/write | method*, projectId, planId, writes/deletes, files, assets |
| Skill | always | run a slash command | skill*, args |
| ReportFindings | always (gated: code-review) | typed findings to UI | findings[]*, level |
| Artifact | interactive | publish HTML/MD as a private page | file_path, favicon, url, action |
| ToolSearch | always | load deferred tool schemas | query, max_results |
Three methods, each more authoritative, and no network capture needed. The parameter schemas come straight from the running session.
claude -p "Introspect and list every tool… output markdown." One thing to know: headless -p exposes a reduced toolset. Artifact, AskUserQuestion, and the plan-mode tools don’t appear (no interactive surface), so add them back by hand.~/.claude/projects/<encoded-cwd>/<session-uuid>.jsonl records the roster (tool_reference, deferred_tools_delta, skill_listing, agent_listing_delta) from the harness, independent of the model, though not the argument schemas (inputSchema isn’t in the transcript).The typed parameters above come from ToolSearch loading each deferred tool’s full JSONSchema, the same definition the CLI would send on the wire, so a packet capture would only show what the session already hands over.
Originally published in TheBigPromptLibrary on GitHub (view source).
⭐ Star the library on GitHub for more system prompts and research.