Overview
This inventory combines themeerkat-tools builtin dispatcher with the
runtime-composed memory, comms, schedule, WorkGraph, mob, image-generation,
and web-search surfaces. Each family remains the source of truth for its own
tool names, schemas, execution contract, mutation class, and gates.
In the table, Default means enabled inside an already-selected tool family.
It does not mean a bare AgentFactory exposes that family. Product surfaces
may apply explicit presets of their own.
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
AgentBuildConfig can override factory-level flags for a single agent build:inherit. The categories backed by factory flags inherit those
flags. Image generation treats inherit as visible once its session-owned
substrate is wired into the normal composite dispatcher. The minimal
no-builtins/no-shell early return requires an explicit image enable to create
that dispatcher. The Meerkat-owned web-search fallback is different: it treats
inherit as hidden and requires an explicit enable. An explicit enable fails
closed if its runtime dependencies cannot be provisioned. Enabling either
category does not enable general builtins.Source: meerkat/src/factory.rs — AgentBuildConfig struct.ToolPolicyLayer
ToolPolicyLayer
ToolPolicyLayer in
BuiltinToolConfig, but policy can only select tools from a category that was
actually composed. When shell is enabled, the factory applies a policy that
activates the four standard shell tools (which have default_enabled: false).
The high-trust monitor_start and all five skill tools also default off and
require an explicit policy enable in a custom dispatcher build.Execution contracts and mutation classes
Execution contracts and mutation classes
ToolExecutionContract per tool. The default is
Fast; tools may additionally support Streaming or Detached. Streaming
contracts own progress/cancellation policy. Detached contracts declare runner
identity, submission idempotency, restart class, and a bounded submission
deadline. The resolved deadline is the narrowest contribution in the call’s
deadline chain.RestartClass values are Adoptable, CheckpointResumable, Replayable, and
NonResumable. A tool can advertise only the classes its runner can honor.Separately, every dispatcher reports ToolMutationClass::ReadOnly,
Mutating, or Unknown. Unknown is fail-closed uncertainty for third-party or
undeclared tools, not an assertion that the call is harmless.Capability registrations
Capability registrations
inventory crate in meerkat-tools/src/lib.rs:- Builtins (
CapabilityId::Builtins):task_list,task_create,task_get,task_update,datetime,apply_patch,view_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, plus opt-inmonitor_start. Controlled byconfig.tools.shell_enabledand per-tool policy. - Image generation: runtime-owned
generate_image, controlled byoverride_image_generationafter runtime capability resolution. - Web search: provider-native search when the active model owns it, otherwise the Meerkat-owned
web_searchfallback; controlled byoverride_web_search. - 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
McpRouter and applied at the next turn boundary.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
TurnToolOverlay:Option<Vec<ToolName>>; .into() converts
the names above. The default supplies an empty host-only dispatch_context.
Set the overlay on StartTurnRequest.runtime.turn_tool_overlay by the flow
engine or another trusted per-turn producer. It is ephemeral — cleared after
the turn completes — and composes with the external filter using
most-restrictive semantics.Public wire requests use the caller-safe PublicTurnToolOverlay shape:
allowed_tools and blocked_tools contain string names. They do not accept
the internal dispatch_context field.Source: meerkat-core/src/service/mod.rs, meerkat-mob/src/runtime/flow.rsDeferred tool catalog control plane
An exact dispatcher can keep eligible session tools out of the LLM’s inline schema set and expose two always-inline control tools instead. The adaptive selector enters deferred mode when a source is still pending, at least two eligible tools exist, or their combined name, description, and schema volume reaches 160 bytes. These tools are not part of the general builtins gate.tool_catalog_search
tool_catalog_search
1-50.catalog_exact, total_matches, results, optional
pending_sources, and optional empty_result_status. Each result reports
name, description, currently_callable, and visibility_status:
loaded, deferred, blocked_by_filter, or temporarily_unavailable.
pending_source is used only as the empty-result status while a catalog source
is pending.Source: meerkat-tools/src/control_plane.rstool_catalog_load
tool_catalog_load
ToolScope and fails closed when it has no
authoritative visibility state.catalog_exact, accepted_names, noop_names, and one
resolution per requested name. Rejection reasons are unknown_key,
not_deferred_eligible, not_filterable, or temporarily_unavailable.
Already staged or visible names are successful no-ops. Accepted loads take
effect at the next boundary, not during the current tool call.Source: meerkat-tools/src/control_plane.rs,
meerkat-core/src/tool_catalog.rsModel-switch tool
brain_swap is available only when the host can realize committed model
handoffs, more than one distinct model is reachable, and tool policy permits
it. Its required target_model argument selects from that reachable set.
The tool returns staged or already_staged; it does not change the model
during the current run. A clean run completion commits the request, which the
runtime attempts to realize before processing the next input. Failed,
interrupted, or hook-denied runs do not commit the switch, and later
realization can still be denied or held. A staging result is not proof that
the model has changed.
Source: meerkat-tools/src/builtin/brain_swap.rs,
meerkat-tools/src/builtin/composite.rs,
meerkat-core/src/agent/state.rs, meerkat-runtime/src/service_ext.rs
Mob tools
AgentMobToolSurface is composed only for sessions with generated MobMachine
authority. It defines the 13 core tools in the inventory above, including
fork_off for durable transcript-forked work and council for bounded
discussion among temporary forks of existing members. Realm
profile storage adds five profile CRUD tools; a parent-owned snapshot provider
also adds mob_profile_list_sources. Admission is then checked again at each
dispatch against the current typed mob, spawn, profile-mutation, or objective
scope. See Mob tools for argument shapes
and workflows.
Host/operator surfaces for placement, binding, grants, observation, live
member sessions, and hard cancellation are control-plane APIs, not agent
builtins, so they are intentionally excluded from this inventory.
Source: meerkat-mob-mcp/src/agent_tools.rs
Schedule 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
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
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. With thesession-store feature, factory-built sessions use a
session-scoped SqliteTaskStore, so resume restores the same task set. Builds
without that feature use FileTaskStore when a project root exists and
MemoryTaskStore otherwise.
Task data model
Task data model
Task object returned by task tools has these fields:meerkat-tools/src/builtin/types.rs — Task struct.task_create
task_create
"low", "medium", or "high".Task object (see task data model above).Source: meerkat-tools/src/builtin/tasks/task_create.rstask_get
task_get
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
"pending", "in_progress", or "completed".Task objects matching the filters.Source: meerkat-tools/src/builtin/tasks/task_list.rstask_update
task_update
"pending", "in_progress", or "completed"."low", "medium", or "high".null to remove).blocks list.blocks list.blocked_by list.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. The effective shell category must first be composed;
the factory then uses ToolPolicyLayer to activate the four standard shell
tools. A policy cannot create an absent shell category, and monitor_start
still requires its own explicit policy enable.
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.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
ShellConfig:meerkat-tools/src/builtin/shell/config.rsShell security modes
Shell security modes
SecurityEngine validates commands before execution using POSIX-compliant word splitting (shlex) and glob pattern matching (globset).meerkat-tools/src/builtin/shell/security.rsshell
shell
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.stdout_lossy and stderr_lossy indicate whether output was lossy-decoded from non-UTF-8 bytes.meerkat-tools/src/builtin/shell/tool.rsmonitor_start
monitor_start
enable_shell alone does not grant this high-trust
tool; an embedding surface must enable it through tool policy. Persistent realm
job and blob stores are required.meerkat-tools/src/builtin/shell/monitor_tool.rsshell_jobs
shell_jobs
status field is one of: "queued", "running",
"completed", "failed", "cancelled", "worker_lost", or
"needs_attention".Source: meerkat-tools/src/builtin/shell/jobs_list_tool.rsshell_job_status
shell_job_status
ExecutionFailed if the job ID is not found.Source: meerkat-tools/src/builtin/shell/job_status_tool.rsshell_job_cancel
shell_job_cancel
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)ExecutionFailed if the job ID is not found.Source: meerkat-tools/src/builtin/shell/job_cancel_tool.rsShell types
Shell types
"job_" followed by a UUID v7 string.JobStatus variants: Queued, Running, Completed, Failed,
Cancelled, WorkerLost, and NeedsAttention (serialized as lowercase
snake_case status tags). A command timeout is represented by the worker’s
terminal failure facts; there is no current TimedOut enum variant.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
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
meerkat-tools/src/builtin/utility/datetime.rsapply_patch
apply_patch
Mutating.*** Begin Patch and *** End Patch. File operations
use *** Add File:, *** Update File:, optional *** Move to:, and
*** Delete File: markers. Update hunks use literal @@ context plus space,
-, and + line prefixes.status: "success" plus added_files,
modified_files, and deleted_files.Source: meerkat-tools/src/builtin/utility/apply_patch.rsview_image
view_image
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)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
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.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
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
blob_id, media_type, and decoded size_bytes.Source: meerkat-tools/src/builtin/utility/blob_file.rsgenerate_image
generate_image
AssistantImageRef values.Tool policy default: Yes after the category has been composed. Factory
category default: Inherit, which is visible in the normal composite when
the image-generation machine, executor, planner, session identity, and blob
store are wired. A minimal no-builtins/no-shell composition needs explicit
Enable; Mob profiles and in-process builds can use that override without
opening general builtins. See the guide for the current surface matrix.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.Web search fallback tool
The active model may receive provider-native web search directly in its provider request. When the active model lacks native search and web search is explicitly enabled,AgentFactory can instead compose the Meerkat-owned
web_search fallback against a configured OpenAI, Gemini, or Anthropic search
executor. The explicit enable fails closed if no executor can be provisioned.
web_search
web_search
openai, gemini, or anthropic. When present it must
match the fallback provider selected for the session.WebSearchResult: status, query, optional provider and
model, optional answer, typed evidence, provider-observed
native_events, optional error, and checked_at. Native events are evidence
from the provider, not Meerkat-owned truth.This tool is classified read-only. Visibility is controlled by
override_web_search, independently from general builtins.Source: meerkat-tools/src/builtin/web_search.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 DynamicToolComposite, NOT bundled into CompositeDispatcher.
Tool availability is reported per tool through the catalog
(comms_tool_unavailable_reason): send_message, reply_to_peer, 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
peers tool.image_ref entries (source: "current_turn" with index, or source: "blob" with blob_id and media_type)."queue" for ordinary delivery or "steer" for immediate steer processing on runtime-backed sessions.meerkat-comms/src/mcp/tools.rssend_request
send_request
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)peers tool."checksum_token" or "supervisor.bridge". Unknown intents fail at the serde boundary.image_ref entries)."queue" for ordinary delivery or "steer" for immediate steer processing on runtime-backed sessions.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
peers tool."accepted", "completed", or "failed".image_ref entries)."queue" or "steer". Forbidden on "accepted" progress responses.meerkat-comms/src/mcp/tools.rspeers
peers
peer_id for sends.Default enabled: Yes (when comms is active)Parameters: None (empty object).meerkat-comms/src/mcp/tools.rs — PeersInputSkill tools
The five skill tools are registered only when aSkillRuntime is present.
Each has default_enabled: false, so an embedding that constructs the builtin
dispatcher must explicitly enable the desired names in BuiltinToolConfig.
Current factory-built CLI, REST, and JSON-RPC sessions register the set but do
not add that policy enable; preload and typed skill_refs still work, but the
interactive skill tools are not advertised there.
Every skill identity is a typed pair of source_uuid and skill_name. The
runtime canonicalizes source-lineage remaps before reading or invoking it.
browse_skills and load_skill
browse_skills and load_skill
browse_skills accepts optional query and source_uuid filters and returns
active skills as {source_uuid, skill_name, name, description} entries.load_skill requires source_uuid and skill_name. It resolves and renders
the skill, returning the canonical identity, display name, rendered body,
and byte_size.Source: meerkat-tools/src/builtin/skills/browse.rs,
meerkat-tools/src/builtin/skills/load.rsSkill resources and functions
Skill resources and functions
skill_list_resources takes source_uuid and skill_name and returns the
skill’s artifact descriptors. skill_read_resource adds a required path and
returns that artifact’s content.skill_invoke_function takes source_uuid, skill_name, function_name, and
optional JSON-object arguments. Its success response echoes the canonical
identity and function name and carries the skill function’s wire-opaque JSON in
output.Source: meerkat-tools/src/builtin/skills/resources.rs,
meerkat-tools/src/builtin/skills/functions.rsCargo feature gates
Tool availability depends on compile-time features in themeerkat-tools crate:
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