#[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,
}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.
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_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.