Overview
| Tool | Category | Default | Gate | Description |
|---|---|---|---|---|
task_create | Task | Yes | — | Create a new task |
task_get | Task | Yes | — | Get a task by ID |
task_list | Task | Yes | — | List tasks with optional filters |
task_update | Task | Yes | — | Update an existing task |
shell | Shell | No | — | Execute a shell command |
shell_jobs | Shell | No | — | List background shell jobs |
shell_job_status | Shell | No | — | Check background job status |
shell_job_cancel | Shell | No | — | Cancel a background job |
memory_search | Memory | N/A | memory-store-session | Search semantic memory |
wait | Utility | Yes | — | Pause execution |
datetime | Utility | Yes | — | Get current date/time |
apply_patch | Utility | Yes | — | Apply structured file patches inside the project root |
view_image | Utility | Yes | vision | Read an image file and return base64 content |
send | Comms | Yes | comms | Send message/request/response to a peer |
peers | Comms | Yes | comms | List discoverable peers (trusted + inproc) |
Enabling and disabling tools
Factory-level flags
Factory-level flags
AgentFactory controls which tool categories are available via builder methods:| Flag | Builder Method | Default | Controls |
|---|---|---|---|
enable_builtins | .builtins(bool) | false | Task tools, utility tools (wait, datetime, apply_patch) |
enable_shell | .shell(bool) | false | All shell tools (shell, shell_jobs, shell_job_status, shell_job_cancel) |
enable_memory | .memory(bool) | false | memory_search (requires memory-store-session feature) |
enable_comms | .comms(bool) | false | All comms tools (requires comms feature) |
enable_mob | .mob(bool) | false | Mob orchestration tools (mob_*, meerkat_*) |
AgentFactory is the only place tool categories are composed. AgentBuilder (in meerkat-core) has no dependency on meerkat-tools and does not auto-register any tools — it takes a pre-built dispatcher. See AgentBuilder vs AgentFactory.Source: meerkat/src/factory.rs — AgentFactory struct and builder methods.Per-build overrides
Per-build overrides
Each
All default to
AgentBuildConfig can override factory-level flags for a single agent build:| Override Field | Type | Effect |
|---|---|---|
override_builtins | Option<bool> | Takes precedence over enable_builtins when Some |
override_shell | Option<bool> | Takes precedence over enable_shell when Some |
override_memory | Option<bool> | Takes precedence over enable_memory when Some |
override_mob | Option<bool> | Takes precedence over enable_mob when Some |
None (use 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,wait,datetime,apply_patch,view_image. Controlled byconfig.tools.builtins_enabled. - Shell (
CapabilityId::Shell):shell,shell_jobs,shell_job_status,shell_job_cancel. Controlled byconfig.tools.shell_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 [SYSTEM NOTICE] is injected into 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
Servers being removed transition through
McpRouter and applied at the next turn boundary.| Surface | Method | Status |
|---|---|---|
| JSON-RPC | mcp/add, mcp/remove, mcp/reload | Fully wired (staged) |
| REST | POST /sessions/{id}/mcp/add|remove|reload | Routes registered (placeholder) |
| CLI | rkat mcp add/remove --session <id> --live-server-url <url> | Delegates to REST |
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 flow tool overlay
Per-turn flow tool overlay
Mob flow steps can restrict tools for a single turn via Set on
TurnToolOverlay:StartTurnRequest.flow_tool_overlay by the flow engine. 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.rsTask 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
Source:
Task object returned by task tools has these fields:| Field | Type | Description |
|---|---|---|
id | String | Unique task identifier |
subject | String | Short subject/title |
description | String | Detailed description |
status | String | "pending", "in_progress", or "completed" |
priority | String | "low", "medium", or "high" |
labels | String[] | Labels/tags for categorization |
blocks | String[] | IDs of tasks that this task blocks |
blocked_by | String[] | IDs of tasks that block this task |
created_at | String | ISO 8601 creation timestamp |
updated_at | String | ISO 8601 last-updated timestamp |
created_by_session | String? | Session ID that created this task |
updated_by_session | String? | Session ID that last updated this task |
owner | String? | Owner/assignee (agent name or user identifier) |
metadata | Object | Arbitrary key-value metadata |
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
Short subject/title of the task.
Detailed description of what needs to be done.
"low", "medium", or "high".Labels/tags for categorization.
Task IDs that this task blocks.
Task IDs that block this task.
Owner/assignee.
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
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
Filter by status:
"pending", "in_progress", or "completed".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
The task ID to update.
New subject/title.
New description.
New status:
"pending", "in_progress", or "completed".New priority:
"low", "medium", or "high".Replace all labels.
New owner/assignee.
Merge metadata (set key to
null to remove).Task IDs to add to the
blocks list.Task IDs to remove from the
blocks list.Task IDs to add to the
blocked_by list.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.
Shell configuration
Shell configuration
Shell behavior is controlled by
Source:
ShellConfig:| Config Field | Type | Default | Description |
|---|---|---|---|
enabled | bool | false | Master switch for shell tools |
default_timeout_secs | u64 | 30 | Default command timeout |
restrict_to_project | bool | true | Restrict working dirs to project root |
shell | String | "nu" | Shell binary name (Nushell by default; falls back to bash/zsh/sh) |
shell_path | PathBuf? | None | Explicit shell binary path |
project_root | PathBuf | CWD | Project root for path restriction |
max_completed_jobs | usize | 100 | Maximum completed jobs retained |
completed_job_ttl_secs | u64 | 300 | TTL for completed job records (seconds) |
max_concurrent_processes | usize | 10 | Maximum concurrent background processes |
security_mode | SecurityMode | Unrestricted | Command security policy |
security_patterns | Vec<String> | [] | Glob patterns for allow/deny lists |
meerkat-tools/src/builtin/shell/config.rsShell security modes
Shell security modes
The
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:
SecurityEngine validates commands before execution using POSIX-compliant word splitting (shlex) and glob pattern matching (globset).| Mode | Behavior |
|---|---|
Unrestricted | All commands allowed (default) |
AllowList | Only commands matching security_patterns globs are allowed |
DenyList | Commands matching security_patterns globs are rejected |
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:
The command to execute (POSIX-style parsing for policy checks).
Working directory (relative to project root).
Timeout in seconds.
If
true, run in background and return job ID immediately.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:
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
Cancel a running background shell job.Default enabled: No (requires shell to be enabled)Error:
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 conversation turns that were compacted away to save context space.The Returns an empty array if no matches are found.Source:
Natural language search query describing what you want to recall.
Maximum number of results to return (max: 20).
limit is capped at 20 regardless of the requested value.meerkat-memory/src/tool.rsUtility tools
Utility tools are general-purpose helpers enabled by default when builtins are on.wait
wait
Pause execution for the specified number of seconds. Supports fractional seconds. Useful for polling loops or rate limiting.Default enabled: YesMaximum wait time is 60 seconds (1 minute). Values are clamped to the range 0.0 to 60.0.Source:
Duration to wait in seconds (clamped to 0.0 to 60.0).
meerkat-tools/src/builtin/utility/wait.rsdatetime
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 model supports vision)Path to the image file, relative to the project root.
view_image is automatically hidden via ToolScope when the active model does not support vision (i.e., ModelProfile.vision == false). It is also hidden when the model does not support image content in tool results (ModelProfile.image_tool_results == false). This means the tool never appears in the tool list sent to models that cannot process image content.Returns: A ToolOutput::Blocks containing a single ContentBlock::Image with the base64-encoded image data and detected media type. The source_path field is set on the domain type but stripped from the wire representation (WireContentBlock).Source: meerkat-tools/src/builtin/utility/view_image.rsComms 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 ToolGateway, NOT bundled into CompositeDispatcher.
Comms tools are only shown to the agent when at least one peer is discoverable
(controlled by CommsToolSurface::peer_availability()). The check passes when
TrustedPeers has entries.
Tool definitions (name, description, input schema) are dynamically loaded from meerkat_comms::tools_list().
send
send
Send a message, request, or response to a trusted peer. The Source:
kind parameter determines the message type.Default enabled: Yes (when comms is active)Peer name to send to.
Message kind:
"peer_message", "peer_request", or "peer_response".Message content (required when
kind="peer_message").Request intent/action identifier (required when
kind="peer_request").Request parameters (for
kind="peer_request").ID of the request being responded to (required when
kind="peer_response").Response status:
"accepted", "completed", or "failed" (required when kind="peer_response").Response result data (for
kind="peer_response").meerkat-comms/src/mcp/tools.rs — SendInputpeers
peers
List all discoverable peers and their connection status.Returns configured trusted peers (Source:
TrustedPeers), excluding the current agent (“self”) by public key.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:
| Feature | Default | Dependencies | Tools unlocked |
|---|---|---|---|
comms | Yes | dep:meerkat-comms | send, peers |
mcp | Yes | dep:meerkat-mcp | External MCP tool routing (not builtin tools) |
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