Skip to content

Built-in Tool Reference

Wayland Core ships a built-in tool registry of ~60+ tools. A universal core is always present (Read/Write/Edit, Bash, Grep/Glob, plus orchestration: Delegate, ToolSearch, Spawn) alongside around 40 more covering git, SQL, web fetch, cloud CLI wrappers, API integrations, media, scheduling, and memory. Around 15 integration tools are availability-gated under a NO-STUBS contract: they appear only when their key, binary, or feature is present.

The 8 tools the old docs listed (Read/Write/Edit/Bash/Grep/Glob/Delegate/ToolSearch) are the primary file, shell, search, and orchestration core. They are never the total.

Source: wcore-agent/src/bootstrap.rs (registry.register calls), wcore-tools/src/ (tool implementations).


These are registered unconditionally on every session start (bootstrap.rs:426-435).

Tool nameSource fileNotes
Readread.rsRead a file with line numbers; offset/limit for slices; binary detection; mtime dedup via file cache.
Writewrite.rsAtomic file write (temp file + rename); parent directories created automatically.
Editedit.rsTargeted string replacement in a file; must be unique unless replace_all is set.
Bashbash.rsShell command execution; runs inside the OS-native sandbox; network denied by default; default timeout 120 s, max 600 s.
Grepgrep.rsRegex search over file contents; uses rg when available, falls back to grep -rn; caps at 250 lines.
Globglob.rsFilesystem glob matching (e.g. **/*.rs); sorted newest-first; caps at 100 files.
Tool nameSourceNotes
Delegatedelegate.rsStructured single-task or batch delegation; up to 5 tasks, 50 turns each; produces structured JSON output; accepts per-task toolsets allowlist.
Spawnspawn_tool.rsMulti-agent fan-out with registry-resolved named agents; OutputSink relay back to parent; FleetDispatcher used when agent count exceeds DEFAULT_SHARD_SIZE.
Workflowworkflow_tool.rsRun an inline RON-format ForgeFlow workflow; parses RON → GraphConfig IR → WorkflowRunner; Agent/Pipeline/Parallel steps.
ToolSearchtool_search.rsLoad full schemas for deferred tools (MCP tools are name-only by default); substring match on name+description; no result cap.

All tools below are registered unconditionally at bootstrap.rs:437-714 unless noted. Tools with a backend seam degrade gracefully on missing credentials.

Tool nameSourceWhat it does
Jsonljsonl_tool.rsStreaming JSON Lines range/filter/count for large log files without loading the whole file.
sql_querysql_query_tool.rsRead-only SQLite queries via rusqlite; no writes permitted.
pdf_extractpdf_tool.rsRead-only PDF text extraction; pure-Rust pdf-extract; degrades to a typed error when built without the pdf feature.
Archivearchive_tool.rsRead-only zip/tar/tar.gz inspection; zip-slip path rejection.
markdown_tablemarkdown_tool.rsMarkdown table format and lint.
image_inspectimage_inspect_tool.rsImage metadata (dimensions, EXIF); reads metadata only, never decodes full pixel data.
email_parseemail_parse_tool.rsParse .eml/.mbox files: headers and text body only; no attachment content.
RepoMaprepomap.rsRepo symbol index for the current working directory; enabled by default via builtin_tools.repomap.enabled.
Tool nameSourceWhat it does
Gitgit.rsTyped wrapper over git ops; read-only ops (log, diff, status) are concurrency-safe; mutating ops (add, commit, checkout, stash) require explicit invocation.
kubectlkubectl_tool.rskubectl get/describe/logs/... read-only wrapper; write ops are not in the allowlist.
gcloudgcloud_tool.rsgcloud list/describe/get-* read-only wrapper.
aws_cliaws_cli_tool.rsaws <service> <op> read-only wrapper.
Tool nameSourceWhat it does
WebFetchweb_fetch.rsPlain HTTP GET with readability extraction for HTML; zero runtime dependencies; SSRF-safe via url_safety::is_safe_url. Works on every install without a sidecar.
webweb_tools.rsWeb search, extract, and crawl. Backend selected at boot: Tavily (TAVILY_API_KEY) → Brave (BRAVE_SEARCH_API_KEY) → DuckDuckGo HTML scrape (no key required).
Tool nameSourceWhat it does
send_messagesend_message.rsCross-channel message dispatch; registered with a fail-loud null transport by default; a real transport (Telegram, Discord, Slack, etc.) must be wired by the host.
Tool nameSourceWhat it does
todotodo.rsIn-session planning and task list; state is per-session (one list per agent bootstrap).
clarifyclarify.rsStructured user-clarification prompt; the host layer intercepts tool calls named clarify to perform the real UI interaction.
AskUserQuestionask_user_question.rsStructured multi-choice question; answer routed back via the approval channel (ToolApprove answer field).
session_searchsession_search.rsFull-text cross-session recall via the memory API. Returns empty results when memory is disabled rather than erroring.

Memory write tools (present when memory.enabled = true)

Section titled “Memory write tools (present when memory.enabled = true)”

These two tools are registered only when persistent memory is enabled. With NullMemory they would advertise capabilities the model cannot exercise.

Tool nameSourceWhat it does
record_episoderecord_episode.rsLog an event to P2 episodic memory (partition 2 of the 5-partition store).
assert_factassert_fact.rsWrite a durable (subject, predicate, object) fact to P3 semantic memory.
Tool nameSourceWhat it does
wayland_statuswayland_introspection.rsRead current session state (model, mode, context usage, active tools). Name confirmed by assert_eq!(WAYLAND_STATUS_TOOL_NAME, "wayland_status").
wayland_telemetry_querywayland_introspection.rsQuery per-session telemetry. Name confirmed by assert_eq!(WAYLAND_TELEMETRY_QUERY_TOOL_NAME, "wayland_telemetry_query").
Tool nameSourceWhat it does
Skillskill_tool.rs (in wcore-agent)Invoke a named skill from the catalog; per-skill permission checker; telemetry sink feeds the procedural-memory loop when memory is enabled.

Availability-gated tools and the NO-STUBS contract

Section titled “Availability-gated tools and the NO-STUBS contract”

Tools without their required credential, binary, or device return Tool::is_available() == false at boot. The LLM never sees a tool it cannot call. Every tool with a backend seam ships a NullXxxBackend that fails loudly (not silently) when called without wiring.

Evidence: bootstrap.rs:557-711 - every env-gated registration is wrapped in if let Some(b) = build_xxx_backend() { registry.register(...) }. A missing env var means the tool is absent from the registry entirely, not present and broken.

Tool nameGating conditionWhat it does
github_apiGITHUB_TOKENGitHub REST: issues, PRs, file reads, comment posts.
gitlab_apiGITLAB_TOKENGitLab REST v4.
linear_apiLINEAR_API_KEYLinear GraphQL: issues, projects, cycles.
notion_apiNOTION_API_KEYNotion block reads and page creation.
discord_serverDISCORD_BOT_TOKENDiscord server operations via bot.
homeassistantHOME_ASSISTANT_URL + HOME_ASSISTANT_TOKENHome Assistant entity reads and service calls.
postgres_schemaPOSTGRES_URL or DATABASE_URLLive Postgres schema introspection via tokio-postgres.

Google Meet (5 tools, shared OAuth backend)

Section titled “Google Meet (5 tools, shared OAuth backend)”

All 5 tools are hidden when GOOGLE_CLIENT_ID is absent or PKCE OAuth has not been completed.

Tool nameWhat it does
meet_joinJoin a Meet session.
meet_statusGet current session status.
meet_transcriptRetrieve meeting transcript.
meet_leaveLeave the current session.
meet_sayIn-call TTS.
Tool nameGating conditionWhat it does
image_generateOPENAI_API_KEY, FAL_KEY, GEMINI_API_KEY, or HUGGINGFACE_API_KEYImage generation via DALL-E 3, FAL, Gemini Imagen, or HuggingFace. First available key wins.
vision_analyzeAnthropic, OpenAI, or Gemini keyLLM-based image analysis; Anthropic preferred, OpenAI/Gemini auto-fallback.
transcribe_audioGROQ_API_KEY or OPENAI_API_KEYAudio transcription via Groq Whisper (preferred) or OpenAI Whisper.
text_to_speechOPENAI_API_KEY or ELEVENLABS_API_KEYText-to-speech via OpenAI or ElevenLabs; optional piper feature-gated local backend.
voice_modeDefault audio input device presentFull voice loop: cpal recorder + STT bridge. Hidden in headless/container/SSH environments where cpal cannot bind a default input device.
video_analyzeffmpeg in PATH + Anthropic/OpenAI/Gemini keyffmpeg probe + LLM vision analysis of video files.
Tool nameGating conditionWhat it does
cronjobcron store path resolvableCreate, list, update, and delete cron jobs; backed by WaylandCronScheduler over FileCronStore.

Browser and computer control (plugin-loaded)

Section titled “Browser and computer control (plugin-loaded)”

These tools are registered by the wayland-browser and wayland-cua plugins, not directly from wcore-tools. They appear in the registry when the plugins are discovered and loaded at boot.

Tool groupPluginGating
Browser tool (18 ops: Navigate, Snapshot, Read, Click, Fill, Press, Select, Upload, Download, Screenshot, GetState, WaitFor, NetworkLog, Console, NewTab, CloseTab, Back, Forward)wayland-browserCamoufox sidecar at localhost:9377, or WAYLAND_BROWSER_HINT=chromium with Chromium installed, or BROWSERBASE_API_KEY + BROWSERBASE_PROJECT_ID.
Computer-use tools (11 ops: LeftClick, RightClick, DoubleClick, MouseMove, Scroll, Type, Key, Screenshot, AxTree, Wait, FrontmostApp)wayland-cuamacOS, Linux X11, Linux Wayland (permissive compositor only), or Windows.

Spotify tools register with default backends in the current build. Gating on SPOTIFY_CLIENT_ID/SPOTIFY_ACCESS_TOKEN is planned for v0.9.1.

Tool nameWhat it does
spotify_playbackCurrent playback state and controls.
spotify_devicesList available devices.
spotify_queueView and modify playback queue.
spotify_searchSearch tracks, albums, artists, playlists.
spotify_playlistsList and inspect playlists.
spotify_albumsList and inspect albums.
spotify_librarySaved library access.
Tool nameNotes
yuanbaoTencent Yuanbao toolset; registers with default backend.

When plan.enabled = true in config, two additional tools are registered:

  • EnterPlanMode - restricts the session to Info-only tools (Read, Grep, Glob, RepoMap, etc.); mutating tools are blocked.
  • ExitPlanMode - restores full tool access.

When builtin_tools.script.enabled = true, a Script tool is registered. It runs against a mini-registry containing a curated subset of the built-in tools (no Spawn, no Script, no MCP) to avoid an Arc cycle. Steps with approval_required: true route through the same approval bridge as the host.


Each tool that needs a backend implement a resolver function (build_xxx_backend()). The resolver checks for the required env var or binary and returns Some(backend) or None. The if let Some(b) = build_xxx_backend() pattern in bootstrap.rs means the registry call is never reached on a None return. The tool is absent from registry.tool_names() and from the system prompt. There is no stub version the model can accidentally call.

This is distinct from MCP tools, which are registered by name and defer schema loading until ToolSearch is called.