#[non_exhaustive]pub struct ToolSchema {
pub name: String,
pub description: String,
pub params: Vec<ParamSchema>,
pub examples: Vec<Example>,
pub map_positionals: bool,
pub subcommands: Vec<ToolSchema>,
pub aliases: Vec<String>,
pub owns_output: bool,
pub raw_argv: bool,
pub glob_passthrough: bool,
pub operations: Vec<String>,
}Expand description
Schema describing a tool’s interface.
Fields (Non-exhaustive)§
This struct is marked as non-exhaustive
Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.name: StringTool name.
description: StringShort description.
params: Vec<ParamSchema>Parameter definitions.
examples: Vec<Example>Usage examples.
map_positionals: boolMap remaining positional args to named params by schema order. Only for MCP/external tools that expect named JSON params. Builtins handle their own positionals and should leave this false.
subcommands: Vec<ToolSchema>Child schemas for subcommand-aware tools (kj context list, …).
Empty for flat tools (cat, grep, ls) — they take the flat binding
path. When non-empty, the kernel walks leading positionals to pick the
active leaf and binds flags against that leaf’s params (see
select_leaf in the kernel).
skip_serializing_if keeps the wire compact for the many flat tools
(no "subcommands":[] noise); default is then required so a flat
tool’s payload (key absent) deserializes back to empty.
aliases: Vec<String>Command-level aliases (ls → list, rm → remove), matched when
routing a positional to a child. Distinct from ParamSchema::aliases,
which name flags.
owns_output: boolThe tool renders its own output, including --json — the kernel
must not re-format its ExecResult through apply_output_format.
Default false: a tool returns typed crate::OutputData and the kernel
renders the requested format uniformly. Set true for tools with bespoke
JSON envelopes (e.g. an embedder’s kj): they consume --json
themselves and emit final bytes. See ToolSchema::with_owned_output.
raw_argv: boolThe tool wants its argv in source order, with types preserved — the
binder must NOT split flags into the unordered flags set. When true,
every argument is bound to positional in the order written (operators
like -f/=/! as strings, operands keeping their Value type), and
named/flags stay empty.
Default false: normal tools get the clap-style order-independent split
(-la == -al). Set true for the rare position-sensitive command
whose operands may themselves look like flags — POSIX test, where
test $x = -n and test 0 -gt -5 must see -n/-5 as literal
operands. See ToolSchema::with_raw_argv.
glob_passthrough: boolThe tool consumes glob patterns as data — the argv binder must pass a bare glob pattern through as literal text instead of expanding it to matching paths.
Default false: shell semantics — cat *.rs sees matching files and
zero matches is a bind-time error. Set true for a tool whose input is
the pattern (glob), so the natural unquoted spelling
(glob **/*.rs) hands the pattern text to the tool instead of walking
the tree at bind time and binding the first match as the “pattern”.
See ToolSchema::with_glob_passthrough.
operations: Vec<String>Dotted effect ids this tool declares (fs.remove, fs.overwrite,
…) — what an embedder reads off tools --json to learn a tool’s
destructive effects instead of recognizing tool names. Empty for a
tool with no destructive effect. A flat tool with several behaviors
behind one schema (kaish-trash’s list/restore/config/empty)
lists every effect any of its behaviors has, not just the ones the
current invocation will reach — the schema is reflected once, before
argv says which behavior runs. See ToolSchema::with_operations.
Implementations§
Source§impl ToolSchema
impl ToolSchema
Sourcepub fn new(
name: impl Into<String>,
description: impl Into<String>,
) -> ToolSchema
pub fn new( name: impl Into<String>, description: impl Into<String>, ) -> ToolSchema
Create a new tool schema.
Sourcepub fn with_raw_argv(self) -> ToolSchema
pub fn with_raw_argv(self) -> ToolSchema
Declare that this tool wants its argv in source order with types
preserved (no flag/positional split). See ToolSchema::raw_argv.
Sourcepub fn with_glob_passthrough(self) -> ToolSchema
pub fn with_glob_passthrough(self) -> ToolSchema
Declare that this tool consumes glob patterns as data: the argv binder
passes bare patterns through as literal text instead of expanding them.
See ToolSchema::glob_passthrough.
Sourcepub fn with_operations(
self,
operations: impl IntoIterator<Item = impl Into<String>>,
) -> ToolSchema
pub fn with_operations( self, operations: impl IntoIterator<Item = impl Into<String>>, ) -> ToolSchema
Declare the dotted effect ids this tool carries. See
ToolSchema::operations.
Sourcepub fn with_positional_mapping(self) -> ToolSchema
pub fn with_positional_mapping(self) -> ToolSchema
Enable positional->named parameter mapping for MCP/external tools.
Sourcepub fn param(self, param: ParamSchema) -> ToolSchema
pub fn param(self, param: ParamSchema) -> ToolSchema
Add a parameter to the schema.
Sourcepub fn example(
self,
description: impl Into<String>,
code: impl Into<String>,
) -> ToolSchema
pub fn example( self, description: impl Into<String>, code: impl Into<String>, ) -> ToolSchema
Add an example to the schema.
Sourcepub fn subcommand(self, child: ToolSchema) -> ToolSchema
pub fn subcommand(self, child: ToolSchema) -> ToolSchema
Add a child schema, making this a subcommand-aware tool.
Sourcepub fn with_command_aliases(
self,
aliases: impl IntoIterator<Item = impl Into<String>>,
) -> ToolSchema
pub fn with_command_aliases( self, aliases: impl IntoIterator<Item = impl Into<String>>, ) -> ToolSchema
Set command-level aliases (e.g. ls for a list subcommand). These
name the command, not its flags; flag aliases live on each
ParamSchema.
Sourcepub fn matches_command(&self, word: &str) -> bool
pub fn matches_command(&self, word: &str) -> bool
True if word names this command — its name or any of its
command-level aliases. Used when routing a positional to a child.
Sourcepub fn with_owned_output(self) -> ToolSchema
pub fn with_owned_output(self) -> ToolSchema
Declare that this tool renders its own output (including --json), so
the kernel won’t re-format its result.
Applies to the whole tree: every subcommand is marked too, and a json
param is advertised on each node that doesn’t already declare one.
Reflection skips json as the kernel-global output flag, so this
re-advertises it for tools that genuinely own it — closing the loop so
help <tool> <sub> lists --json where the tool actually handles it.
Trait Implementations§
Source§impl Clone for ToolSchema
impl Clone for ToolSchema
Source§fn clone(&self) -> ToolSchema
fn clone(&self) -> ToolSchema
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more