Skip to main content

ToolOutput

Enum ToolOutput 

Source
#[non_exhaustive]
pub enum ToolOutput { Payload(Value), Result(CallToolResult), }
Available on non-WebAssembly only.
Expand description

Output of a ToolHandler call: either a plain value the server wraps into a CallToolResult, or a fully-formed CallToolResult the handler owns end-to-end.

A handler that implements only ToolHandler::handle (the common case) never constructs this enum — the default ToolHandler::handle_output wraps the returned value in ToolOutput::Payload, preserving today’s behavior exactly.

This is a control enum consumed inside the server dispatch tail, NOT a wire type — it deliberately does not derive Serialize/Deserialize.

Marked #[non_exhaustive]: additional output modes may be added in a backwards-compatible way, so downstream matches must include a wildcard arm.

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

Payload(Value)

A plain value. The server runs it through the existing tail: response middleware (redaction/sanitization), the Phase 102 task create-path gate, and text-wrap / widget enrichment — byte-identical to returning a Value from ToolHandler::handle today.

§

Result(CallToolResult)

A fully-formed CallToolResult the handler owns.

§⚠️ BYPASS WARNING — this variant is sent to the wire VERBATIM

The contained CallToolResult is serialized and returned to the client exactly as provided. It BYPASSES:

  • response middleware — redaction, sanitization, and audit hooks (ToolMiddleware::on_response) DO NOT run for this variant;
  • text-wrappingcontent is not synthesized from a stringified value;
  • widget enrichmentstructured_content / _meta are not injected.

The handler is therefore responsible for its OWN redaction and sanitization of both content and _meta, at the same trust level as returning a raw Value today. This is a deliberate, user-approved design choice (D-04a): a handler that needs to own the full envelope (e.g. to set _meta[relatedTask]) opts into owning its security posture too.

What is NOT bypassed: request middleware (ToolMiddleware::on_request) still runs before the handler executes, and handler errors still route through the normal error path. Only the successful Result arm skips response middleware.

See the phase migration guide for how to move a hand-written handler onto this variant safely.

Trait Implementations§

Source§

impl Debug for ToolOutput

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more