TypedToolWithOutput

Struct TypedToolWithOutput 

Source
pub struct TypedToolWithOutput<TIn, TOut, F>
where TIn: DeserializeOwned + Send + Sync + 'static, TOut: Serialize + Send + Sync + 'static, F: Fn(TIn, RequestHandlerExtra) -> Pin<Box<dyn Future<Output = Result<TOut>> + Send>> + Send + Sync,
{ /* private fields */ }
Available on non-WebAssembly only.
Expand description

A typed tool with both input and output type safety

This variant provides type safety for both input arguments and return values. While output schemas are not part of the MCP protocol, they’re useful for testing, documentation, and API contracts.

Implementations§

Source§

impl<TIn, TOut, F> TypedToolWithOutput<TIn, TOut, F>
where TIn: DeserializeOwned + Send + Sync + 'static, TOut: Serialize + Send + Sync + 'static, F: Fn(TIn, RequestHandlerExtra) -> Pin<Box<dyn Future<Output = Result<TOut>> + Send>> + Send + Sync,

Source

pub fn new(name: impl Into<String>, handler: F) -> Self
where TIn: JsonSchema, TOut: JsonSchema,

Available on crate feature schema-generation only.

Create a new typed tool with automatic input and output schema generation

Source

pub fn new_input_only(name: impl Into<String>, handler: F) -> Self
where TIn: JsonSchema,

Available on crate feature schema-generation only.

Create with only input schema generation (output schema omitted)

Source

pub fn new_with_schemas( name: impl Into<String>, input_schema: Value, output_schema: Option<Value>, handler: F, ) -> Self

Create with manually provided schemas

Source

pub fn with_description(self, description: impl Into<String>) -> Self

Set the description for this tool

Source

pub fn with_annotations(self, annotations: ToolAnnotations) -> Self

Set annotations for this tool.

These annotations will be merged with the auto-generated output schema annotation. User-provided hints (readOnlyHint, destructiveHint, etc.) will be combined with the output schema annotation.

§Example
use pmcp::server::typed_tool::TypedToolWithOutput;
use pmcp::types::ToolAnnotations;
use serde::{Deserialize, Serialize};
use schemars::JsonSchema;

#[derive(Debug, Deserialize, JsonSchema)]
struct QueryArgs { sql: String }

#[derive(Debug, Serialize, JsonSchema)]
struct QueryResult { rows: Vec<String> }

let tool = TypedToolWithOutput::new("query", |args: QueryArgs, _| {
    Box::pin(async move {
        Ok(QueryResult { rows: vec![] })
    })
})
.with_description("Execute SQL query")
.with_annotations(
    ToolAnnotations::new()
        .with_read_only(true)
        .with_idempotent(true)
);
// Tool now has both readOnlyHint and auto-generated pmcp:outputSchema
Source

pub fn read_only(self) -> Self

Mark this tool as read-only (convenience method).

Source

pub fn destructive(self) -> Self

Mark this tool as destructive (convenience method).

Source

pub fn idempotent(self) -> Self

Mark this tool as idempotent (convenience method).

Source

pub fn open_world(self) -> Self

Mark this tool as interacting with external systems (convenience method).

Source

pub fn output_schema(&self) -> Option<&Value>

Get the output schema (if any) for testing/documentation purposes

Trait Implementations§

Source§

impl<TIn, TOut, F> Debug for TypedToolWithOutput<TIn, TOut, F>
where TIn: DeserializeOwned + Send + Sync + 'static, TOut: Serialize + Send + Sync + 'static, F: Fn(TIn, RequestHandlerExtra) -> Pin<Box<dyn Future<Output = Result<TOut>> + Send>> + Send + Sync,

Source§

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

Formats the value using the given formatter. Read more
Source§

impl<TIn, TOut, F> ToolHandler for TypedToolWithOutput<TIn, TOut, F>
where TIn: DeserializeOwned + Send + Sync + 'static, TOut: Serialize + Send + Sync + 'static, F: Fn(TIn, RequestHandlerExtra) -> Pin<Box<dyn Future<Output = Result<TOut>> + Send>> + Send + Sync,

Source§

fn handle<'life0, 'async_trait>( &'life0 self, args: Value, extra: RequestHandlerExtra, ) -> Pin<Box<dyn Future<Output = Result<Value>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Handle a tool call with the given arguments.
Source§

fn metadata(&self) -> Option<ToolInfo>

Get tool metadata including description and schema. Returns None to use default empty metadata.

Auto Trait Implementations§

§

impl<TIn, TOut, F> Freeze for TypedToolWithOutput<TIn, TOut, F>
where F: Freeze,

§

impl<TIn, TOut, F> RefUnwindSafe for TypedToolWithOutput<TIn, TOut, F>

§

impl<TIn, TOut, F> Send for TypedToolWithOutput<TIn, TOut, F>

§

impl<TIn, TOut, F> Sync for TypedToolWithOutput<TIn, TOut, F>

§

impl<TIn, TOut, F> Unpin for TypedToolWithOutput<TIn, TOut, F>
where F: Unpin, TIn: Unpin, TOut: Unpin,

§

impl<TIn, TOut, F> UnwindSafe for TypedToolWithOutput<TIn, TOut, F>
where F: UnwindSafe, TIn: UnwindSafe, TOut: UnwindSafe,

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<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: 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: 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> 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