Overview
The built-in tools below are owned by themeerkat-tools builtin dispatcher
(build_builtin_dispatcher / BuiltinDispatcherConfig in
meerkat-tools/src/builtin), which is the source of truth for tool names,
categories, and gates.
Enabling and disabling tools
Factory-level flags
Factory-level flags
AgentFactory controls which tool categories are available via builder methods:AgentFactory is the only place tool categories are composed. The public meerkat::AgentBuilder delegates to the factory path with explicit client/tool/store overrides. The lower-level meerkat_core::AgentBuilder is not re-exported by the facade and is not a public standalone embedding API. See AgentBuilder vs AgentFactory.Source: meerkat/src/factory.rs — AgentFactory struct and builder methods.Per-build overrides
Per-build overrides
Each
AgentBuildConfig can override factory-level flags for a single agent build:All default to
inherit (use the factory-level setting).Source: meerkat/src/factory.rs — AgentBuildConfig struct.ToolPolicyLayer
ToolPolicyLayer
Individual tools can be enabled or disabled via
ToolPolicyLayer in BuiltinToolConfig. When shell is enabled, a ToolPolicyLayer is applied that activates the four shell tools (which have default_enabled: false).Capability registrations
Capability registrations
Capabilities are registered via the
inventory crate in meerkat-tools/src/lib.rs:- Builtins (
CapabilityId::Builtins):task_list,task_create,task_get,task_update,datetime,apply_patch,view_image, runtime-backedgenerate_image, and runtime-backedblob_save_file/blob_load_file/blob_inspectwhen a blob store is available. Controlled byconfig.tools.builtins_enabled. - Shell (
CapabilityId::Shell):shell,shell_jobs,shell_job_status,shell_job_cancel. Controlled byconfig.tools.shell_enabled. - Schedule (
CapabilityId::Schedule):meerkat_schedule_*. Controlled byconfig.tools.schedule_enabled. - WorkGraph (
CapabilityId::WorkGraph):workgraph_*. Controlled byconfig.tools.workgraph_enabled.
Runtime tool scoping
Beyond static factory flags and per-build overrides, tool visibility can be changed at runtime during a live session. See Tool scoping for the conceptual overview.ToolScope lifecycle
ToolScope lifecycle
ToolScope (in meerkat-core) manages runtime tool visibility. It holds the base tool set from the dispatcher, an active external filter, and an optional per-turn overlay.Staging: External callers stage filter updates via ToolScopeHandle::stage_external_filter(filter). The staged filter is NOT applied immediately — the current turn is unaffected.Boundary apply: At the start of each CallingLlm loop iteration, tool_scope.apply_staged(dispatcher_tools) atomically promotes the staged filter to active, prunes stale tool names, and returns the visible tool set. A ToolConfigChanged event is emitted and a typed tool_config system notice is recorded in the conversation.Filter types:ToolFilter::All— no restriction (default)ToolFilter::Allow(set)— only listed tools are visibleToolFilter::Deny(set)— listed tools are hidden
tool_scope_external_filter and restored on session resume.Source: meerkat-core/src/tool_scope.rsLive MCP server mutation
Live MCP server mutation
MCP servers can be added or removed from a running session. Operations are staged on the
McpRouter and applied at the next turn boundary.Servers being removed transition through
Active → Removing (draining) → Removed to allow in-flight tool calls to complete before finalization.Source: meerkat-mcp/src/router.rs, meerkat-rpc/src/handlers/mcp.rsPer-turn tool overlay
Per-turn tool overlay
Mob flow steps can restrict tools for a single turn via Set on
TurnToolOverlay:StartTurnRequest.turn_tool_overlay by the flow engine and other per-turn producers. Ephemeral — cleared after the turn completes. Composes with the external filter using most-restrictive semantics.Source: meerkat-core/src/service/mod.rs, meerkat-mob/src/runtime/flow.rsSchedule tools
Schedule tools are the agent-facing scheduler surface. They are distinct from the host APIs (schedule/* over RPC and /schedules/* over REST).
Schedule tool inventory
Schedule tool inventory
These tools are provided by
ScheduleToolDispatcher in meerkat-schedule and are gated by the scheduler capability.WorkGraph tools
WorkGraph tools are the agent-facing write path for durable work. Host RPC, REST, and CLI expose observability; CLI and trusted hosts add narrow goal and attention controls.WorkGraph tool inventory
WorkGraph tool inventory
For operating guidance, load the
workgraph-workflow companion skill when it
is available. For the data model and host observability surfaces, see
WorkGraph reference.Task tools
Task tools provide structured work tracking. They are enabled by default when builtins are on. Tasks are persisted viaTaskStore (either FileTaskStore on disk or MemoryTaskStore in-memory).
Task data model
Task data model
A
Task object returned by task tools has these fields:Source:
meerkat-tools/src/builtin/types.rs — Task struct.task_create
task_create
Create a new task in the project task list.Default enabled: YesReturns: The created
String
required
Short subject/title of the task.
String
required
Detailed description of what needs to be done.
String
default:"medium"
"low", "medium", or "high".String[]
default:"[]"
Labels/tags for categorization.
String[]
default:"[]"
Task IDs that this task blocks.
String[]
default:"[]"
Task IDs that block this task.
String
default:"null"
Owner/assignee.
Object
default:"{}"
Arbitrary key-value metadata.
Task object (see task data model above).Source: meerkat-tools/src/builtin/tasks/task_create.rstask_get
task_get
Get a task by its ID.Default enabled: YesReturns: The
String
required
The task ID to retrieve.
Task object matching the given ID.Error: ExecutionFailed if the task ID is not found.Source: meerkat-tools/src/builtin/tasks/task_get.rstask_list
task_list
List tasks in the project, optionally filtered by status or labels.Default enabled: YesReturns: Array of
String
default:"null (all)"
Filter by status:
"pending", "in_progress", or "completed".String[]
default:"null (all)"
Filter by labels (tasks matching any label).
Task objects matching the filters.Source: meerkat-tools/src/builtin/tasks/task_list.rstask_update
task_update
Update an existing task. Only provided fields are modified; omitted fields remain unchanged.Default enabled: YesReturns: The updated
String
required
The task ID to update.
String
default:"unchanged"
New subject/title.
String
default:"unchanged"
New description.
String
default:"unchanged"
New status:
"pending", "in_progress", or "completed".String
default:"unchanged"
New priority:
"low", "medium", or "high".String[]
default:"unchanged"
Replace all labels.
String
default:"unchanged"
New owner/assignee.
Object
default:"unchanged"
Merge metadata (set key to
null to remove).String[]
default:"[]"
Task IDs to add to the
blocks list.String[]
default:"[]"
Task IDs to remove from the
blocks list.String[]
default:"[]"
Task IDs to add to the
blocked_by list.String[]
default:"[]"
Task IDs to remove from the
blocked_by list.Task object.Error: ExecutionFailed if the task ID is not found.Source: meerkat-tools/src/builtin/tasks/task_update.rsShell tools
Shell tools execute commands and manage background jobs. They are alldefault_enabled: false and require the factory-level enable_shell flag (or a ToolPolicyLayer override) to be active.
command: "some-command &" and background: true are different contracts.
An ampersand is only syntax interpreted by the selected shell. Meerkat still
executes that shell invocation through the foreground tool path, returns the
ordinary foreground result, and does not create a job ID or a record visible to
shell_jobs, shell_job_status, or shell_job_cancel. Any child the shell
leaves running is unmanaged and its lifetime is not guaranteed.
Use background: true when the command must be managed as a Meerkat shell job.
It commits and returns a stable job ID and enables durable status/list/cancel
operations. This does not claim that the subprocess survives a host restart:
the durable record survives and reports the non-resumable worker loss.
Timeout hierarchy
Tool execution has layered deadlines; the narrowest applicable layer wins.
Changing the normal Meerkat tool timeout cannot extend a narrower shell,
SDK/builder
ToolDispatcher, or MobKit callback deadline. The foreground shell
and dispatcher deadlines are distinct enforced layers, even though both
defaults currently come from ToolTimeoutPolicy. Background shell submission
returns within the normal tool call, but the spawned command keeps its own shell
timeout. The command runs under one fenced non-resumable attempt; terminal state
is committed before runtime notification delivery.
Shell configuration
Shell configuration
Shell behavior is controlled by
ShellConfig:Source:
meerkat-tools/src/builtin/shell/config.rsShell security modes
Shell security modes
The
SecurityEngine validates commands before execution using POSIX-compliant word splitting (shlex) and glob pattern matching (globset).Patterns are matched against the canonicalized command invocation. The engine parses the full command string into individual words, then validates the executable (first word) and the full command string against the pattern set.Source:
meerkat-tools/src/builtin/shell/security.rsshell
shell
Execute a shell command. Uses POSIX-style parsing for policy checks; runs via Nushell or fallback shell.Default enabled: No (requires shell to be enabled)Source:
String
required
The command to execute (POSIX-style parsing for policy checks).
String
default:"Project root"
Working directory (relative to project root).
u64
default:"Config default (30)"
Timeout in seconds.
bool
default:"false"
If
true, durably submit a non-resumable shell job and return its stable job
ID. Requires persistent realm job and blob stores. Job truth survives restart;
a lost subprocess is classified as worker_lost, not replayed.Output is truncated to the last 100,000 characters if it exceeds that limit. Fields
stdout_lossy and stderr_lossy indicate whether output was lossy-decoded from non-UTF-8 bytes.meerkat-tools/src/builtin/shell/tool.rsshell_jobs
shell_jobs
List all background shell jobs.Default enabled: No (requires shell to be enabled)Parameters: None (empty object).The
status field is one of: "running", "completed", "failed", "timed_out", "cancelled".Source: meerkat-tools/src/builtin/shell/jobs_list_tool.rsshell_job_status
shell_job_status
Check status of a background shell job. Returns full job details including output when complete.Default enabled: No (requires shell to be enabled)Error:
String
required
The job ID to check.
ExecutionFailed if the job ID is not found.Source: meerkat-tools/src/builtin/shell/job_status_tool.rsshell_job_cancel
shell_job_cancel
Request cancellation of a running background shell job. For a live process,
success returns Error:
cancellation_requested; this is not a terminal acknowledgement.
Poll shell_job_status until it reports cancelled. Meerkat publishes terminal
cancelled status only after the worker proves the complete process group has
been contained. Synthetic jobs with no live process may return cancelled
immediately because there is nothing to contain.Default enabled: No (requires shell to be enabled)String
required
The job ID to cancel.
ExecutionFailed if the job ID is not found.Source: meerkat-tools/src/builtin/shell/job_cancel_tool.rsShell types
Shell types
JobId format:
"job_" followed by a UUID v7 string.JobStatus variants: Running, Completed, Failed, TimedOut, Cancelled (serialized as lowercase snake_case strings).Source: meerkat-tools/src/builtin/shell/types.rsMemory tool
The memory search tool lives in themeerkat-memory crate and is composed into the tool dispatcher as a separate MemorySearchDispatcher (implementing AgentToolDispatcher). It is NOT part of CompositeDispatcher — it is wired via ToolGateway when the memory-store-session feature is enabled and enable_memory is true.
memory_search
memory_search
Search semantic memory for past conversation content. Memory contains text from earlier turns in the current session that were compacted away to save context space.The
String
required
Natural language search query describing what you want to recall.
usize
default:"5"
Maximum number of results to return (max: 20).
limit is capped at 20 regardless of the requested value.source_range is the half-open [start, end) offset range of the source
message(s) the entry was indexed from. Memory is scoped to a single session;
results do not carry a session_id, and there is no cross-session recall.Returns an empty array if no matches are found.Source: meerkat-memory/src/tool.rsUtility tools
Utility tools are general-purpose helpers enabled by default when builtins are on.datetime
datetime
Get the current date and time. Returns ISO 8601 formatted datetime and Unix timestamp.Default enabled: YesParameters: None (empty object).Source:
meerkat-tools/src/builtin/utility/datetime.rsview_image
view_image
Read an image file from the project directory and return its contents as a base64-encoded Supported formats: PNG, JPEG, GIF, WebP, SVG.Size limit: 5 MB. Files exceeding this limit return an error.Capability gating:
ContentBlock::Image. This enables vision-capable models to analyze images from disk during tool use.Default enabled: Yes (when builtins are on and the model supports image tool results)String
required
Path to the image file, relative to the project root.
view_image is currently hidden via ToolScope when the active model does not support image content in tool results (ModelProfile.image_tool_results == false).Returns: A content-block result containing a single ContentBlock::Image with the base64-encoded image data and detected media type.Source: meerkat-tools/src/builtin/utility/view_image.rsblob_save_file
blob_save_file
Save decoded bytes from the session blob store to a file inside the project root. This is the model-facing equivalent of materializing a blob with Returns: JSON metadata:
rkat blob get, but it remains sandboxed to the active project.Default enabled: Yes when builtins are on and the runtime-backed session has a blob store.String
required
Blob ID to save.
String
required
Destination path, relative to the project root or absolute within the project root.
Boolean
default:"false"
Whether to replace an existing file.
blob_id, media_type, path, and bytes_written. Raw bytes are never returned in the tool result.Source: meerkat-tools/src/builtin/utility/blob_file.rsblob_load_file
blob_load_file
Read a file inside the project root and store its bytes in the realm blob store.Default enabled: Yes when builtins are on and the runtime-backed session has a blob store.Size limit: 25 MB.Returns: JSON metadata:
String
required
Source path, relative to the project root or absolute within the project root.
String
default:"inferred from extension"
Optional media type. When omitted, Meerkat infers common image, text, JSON, CSV, SVG, and PDF media types from the file extension.
blob_id, media_type, path, and bytes_read. Raw bytes are never returned in the tool result.Source: meerkat-tools/src/builtin/utility/blob_file.rsblob_inspect
blob_inspect
Inspect a blob without returning its raw payload.Default enabled: Yes when builtins are on and the runtime-backed session has a blob store.Returns: JSON metadata:
String
required
Blob ID to inspect.
blob_id, media_type, and decoded size_bytes.Source: meerkat-tools/src/builtin/utility/blob_file.rsgenerate_image
generate_image
Generate or edit an assistant-owned image through the session image-generation substrate. Generated bytes are committed to the realm blob store and returned as durable Common request:Targets:
AssistantImageRef values.Default enabled: Yes when builtins are on and the runtime-backed session has image-generation machine, executor, planner, and blob-store wiring.Object
required
Image generation request. The simple shape supports
intent, prompt, instruction, source_images, reference_images, size, quality, format, count/n, target, provider, model, and provider_params.auto uses the current provider’s image profile when available. Use provider: "openai" or provider: "gemini" to force a provider default. Use provider plus model to force a provider-owned image model.Supported universal options: size accepts auto, 1024x1024, 1024x1536, 1536x1024, or WIDTHxHEIGHT; quality accepts auto, low, medium, high; format accepts auto, png, jpeg, jpg, webp; count is currently limited to 1.Provider params: Use top-level size, quality, format, and intent for normal requests; these are Meerkat fields, not raw provider params. For the current gpt-image-2 default, OpenAI provider_params should normally be limited to background, output_compression, moderation, hosted-tool-only action, hosted-tool-only reasoning_effort, and hosted-tool-only web_search; background is auto or opaque only, output_compression applies when format is jpeg/webp, moderation is auto or low, action is usually omitted in favor of top-level intent, and input_fidelity is not accepted by Meerkat. Gemini accepts aspect_ratio and image_size.Returns: ImageGenerationToolResult JSON containing operation_id, terminal, images, provider_text, revised_prompt, native_metadata, and warnings. Each generated image includes blob_ref.blob_id, which can be saved from inside the session with blob_save_file or fetched externally with rkat blob get <blob_id> --output image.png.Source: meerkat-tools/src/builtin/image_generation.rsSee Image generation for provider behavior, examples, and troubleshooting.Comms tools
Comms tools enable inter-agent communication. They require thecomms Cargo feature (dep:meerkat-comms) and the factory-level enable_comms flag. Unlike other tool categories, comms tools are provided as a separate CommsToolSurface dispatcher (implementing AgentToolDispatcher) and composed via DynamicToolComposite, NOT bundled into CompositeDispatcher.
Tool availability is reported per tool through the catalog
(comms_tool_unavailable_reason): send_message and peers are advertised
even before any peers are configured, while send_request and send_response
require a runtime-bound command authority and are otherwise marked unavailable
with the typed reason RuntimeCommandAuthorityUnavailable.
Tool definitions (name, description, input schema) are dynamically loaded from meerkat_comms::tools_list().
send_message
send_message
Send a fire-and-forget collaboration message to a trusted peer.Default enabled: Yes (when comms is active)Source:
String
required
Canonical peer ID from the
peers tool.String
Optional display name, retained only for diagnostics.
String
required
Message content.
Array
Optional multimodal blocks: text entries or
image_ref entries (source: "current_turn" with index, or source: "blob" with blob_id and media_type).String
required
Use
"queue" for ordinary delivery or "steer" for immediate steer processing on runtime-backed sessions.meerkat-comms/src/mcp/tools.rssend_request
send_request
Send a structured request to a trusted peer. Use when you want explicit Source:
intent + params and a correlated response via send_response. Requires a runtime-bound command authority.Default enabled: Yes (when comms is active and runtime command authority is attached)String
required
Canonical peer ID from the
peers tool.String
Optional display name, retained only for diagnostics.
String
required
Typed request intent:
"checksum_token" or "supervisor.bridge". Unknown intents fail at the serde boundary.Object
required
Request parameters, validated against the selected intent.
Array
Optional multimodal blocks (text and
image_ref entries).String
required
Use
"queue" for ordinary delivery or "steer" for immediate steer processing on runtime-backed sessions.Use
send_message for normal agent collaboration. Use send_request only when you want an explicit structured ask and later send_response correlated by in_reply_to.meerkat-comms/src/mcp/tools.rssend_response
send_response
Send a response to a previously received request from a trusted peer. Requires a runtime-bound command authority.Default enabled: Yes (when comms is active and runtime command authority is attached)Source:
String
required
Canonical peer ID from the
peers tool.String
Optional display name, retained only for diagnostics.
String (UUID)
required
ID of the request being responded to.
String
required
Response status:
"accepted", "completed", or "failed".Object
default:"null"
Typed response payload, validated against the original request contract.
Array
Optional multimodal blocks (text and
image_ref entries).String
Optional override for terminal responses:
"queue" or "steer". Forbidden on "accepted" progress responses.meerkat-comms/src/mcp/tools.rspeers
peers
List all visible peers with connection info and optional metadata.Returns entries from the Source:
TrustStore (keyed by canonical PeerId), excluding the current agent (“self”) by public key. Names are display labels and may not be unique — use peer_id for sends.Default enabled: Yes (when comms is active)Parameters: None (empty object).meerkat-comms/src/mcp/tools.rs — PeersInputCargo feature gates
Tool availability depends on compile-time features in themeerkat-tools crate:
The
memory_search tool is gated by the memory-store-session feature on the meerkat facade crate (not meerkat-tools), since MemorySearchDispatcher lives in meerkat-memory.
Source: meerkat-tools/Cargo.toml