#[non_exhaustive]pub struct ToolSchema {Show 13 fields
pub name: String,
pub description: String,
pub params: Vec<ParamSchema>,
pub typed_substitution: bool,
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 arg_binding: ArgBinding,
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.
typed_substitution: boolWhether $(tool) binds this tool’s .data as a typed value rather
than binding its text. See ToolSchema::with_typed_substitution.
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.
arg_binding: ArgBindingHow the binder hands this tool its arguments. See ArgBinding.
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.
Setting this and ToolSchema::with_verbatim_argv together is a
mistake; verbatim wins.
Sourcepub fn with_verbatim_argv(self) -> ToolSchema
pub fn with_verbatim_argv(self) -> ToolSchema
Declare that this tool parses its own argv: the binder fills
ToolArgs::words with every word after the tool name, in source
order, post-expansion, and leaves the split empty. See ArgBinding
for when to use it. ToolArgs::to_argv cannot put
them back — a verbatim tool builds its argv from words with no
inversion at all (ToolArgs::words_argv does the rendering).
The kernel still owns the global flags: --json is removed from
words wherever it appears and applied to the output format, so a
verbatim tool never sees it and cannot get it wrong. The schema is
unchanged either way — it still supplies help, completion and the
parameter list.
Distinct from ToolSchema::with_raw_argv, which also keeps source
order but binds into positional and does not lift the global flags.
Setting both is a mistake; verbatim wins.
With ToolSchema::with_owned_output the tool keeps --json in its
own words — the kernel renders nothing for such a tool, so lifting the
flag would leave it handled by no one.
Sourcepub fn with_typed_substitution(self) -> ToolSchema
pub fn with_typed_substitution(self) -> ToolSchema
Declare that this tool’s .data IS its value, so $(tool) binds it
typed instead of binding the text it printed.
.data does three jobs: it feeds --json, it is the pipeline’s
structured sideband, and it is what a command substitution binds. Only
the third is a question of taste, and answering it from “does this tool
set .data” got it wrong: cut -f2 f bound ["b"] while
awk '{print $2}' f, doing the identical job, bound text.
Declare it when the structured thing IS the answer — fromjson, jq,
keys, values. Leave it off when .data is a structured VIEW of
text the tool already printed, which is every tool with a POSIX
counterpart: those read as their POSIX selves, and a caller who wants
types asks with --json.
Not inferable from the constructor: jq and cut both build with
success_with_data and belong on opposite sides.
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 moreSource§impl Debug for ToolSchema
impl Debug for ToolSchema
Source§impl<'de> Deserialize<'de> for ToolSchema
impl<'de> Deserialize<'de> for ToolSchema
Source§fn deserialize<__D>(
__deserializer: __D,
) -> Result<ToolSchema, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(
__deserializer: __D,
) -> Result<ToolSchema, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
Source§impl Serialize for ToolSchema
impl Serialize for ToolSchema
Source§fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
Auto Trait Implementations§
impl Freeze for ToolSchema
impl RefUnwindSafe for ToolSchema
impl Send for ToolSchema
impl Sync for ToolSchema
impl Unpin for ToolSchema
impl UnsafeUnpin for ToolSchema
impl UnwindSafe for ToolSchema
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<T> FutureExt for T
impl<T> FutureExt for T
Source§fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ
fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ
Source§fn with_current_context(self) -> WithContext<Self> ⓘ
fn with_current_context(self) -> WithContext<Self> ⓘ
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
impl<T> OrderedSeq<'_, T> for Twhere
T: Clone,
Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<'p, T> Seq<'p, T> for Twhere
T: Clone,
impl<'p, T> Seq<'p, T> for Twhere
T: Clone,
Source§impl<T, S> SpanWrap<S> for Twhere
S: WrappingSpan<T>,
impl<T, S> SpanWrap<S> for Twhere
S: WrappingSpan<T>,
Source§fn with_span(self, span: S) -> <S as WrappingSpan<Self>>::Spanned
fn with_span(self, span: S) -> <S as WrappingSpan<Self>>::Spanned
WrappingSpan::make_wrapped to wrap an AST node in a span.