Skip to main content

CompositeHandler

Struct CompositeHandler 

Source
pub struct CompositeHandler { /* private fields */ }
Expand description

Server composition through handler mounting. A composite handler that mounts multiple handlers with prefixes.

This enables modular server design by combining multiple handlers into a single namespace. Each mounted handler’s tools, resources, and prompts are automatically prefixed to avoid naming conflicts.

§Namespacing Rules

  • Tools: {prefix}_{tool_name} (e.g., weather_get_forecast)
  • Resources: {prefix}://{original_uri} (e.g., weather://api/forecast)
  • Prompts: {prefix}_{prompt_name} (e.g., weather_forecast_prompt)

§Thread Safety

CompositeHandler is Send + Sync when all mounted handlers are.

Implementations§

Source§

impl CompositeHandler

Source

pub fn new(name: impl Into<String>, version: impl Into<String>) -> Self

Create a new composite handler with the given name and version.

§Example
let server = CompositeHandler::new("my-server", "1.0.0");
Source

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

Set the server description.

Source

pub fn mount<H: McpHandler>(self, handler: H, prefix: impl Into<String>) -> Self

Mount a handler with the given prefix.

All tools, resources, and prompts from the handler will be namespaced with the prefix.

§Panics

Panics if a handler with the same prefix is already mounted. This prevents silent shadowing of tools/resources/prompts which could lead to confusing runtime behavior.

§Example
let server = CompositeHandler::new("main", "1.0.0")
    .mount(weather_handler, "weather")
    .mount(news_handler, "news");
Source

pub fn try_mount<H: McpHandler>( self, handler: H, prefix: impl Into<String>, ) -> Result<Self, String>

Try to mount a handler with the given prefix, returning an error on duplicate.

This is the fallible version of mount for cases where you want to handle duplicate prefixes gracefully rather than panicking.

§Errors

Returns an error if a handler with the same prefix is already mounted.

Source

pub fn handler_count(&self) -> usize

Get the number of mounted handlers.

Source

pub fn prefixes(&self) -> Vec<&str>

Get all mounted prefixes.

Trait Implementations§

Source§

impl Clone for CompositeHandler

Source§

fn clone(&self) -> CompositeHandler

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for CompositeHandler

Source§

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

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

impl McpHandler for CompositeHandler

Source§

fn server_info(&self) -> ServerInfo

Returns server information (name, version, description, etc.) Read more
Source§

fn list_tools(&self) -> Vec<Tool>

Returns all available tools. Read more
Source§

fn list_resources(&self) -> Vec<Resource>

Returns all available resources. Read more
Source§

fn list_prompts(&self) -> Vec<Prompt>

Returns all available prompts. Read more
Source§

fn call_tool<'a>( &'a self, name: &'a str, args: Value, ctx: &'a RequestContext, ) -> impl Future<Output = McpResult<ToolResult>> + MaybeSend + 'a

Calls a tool by name with the given arguments. Read more
Source§

fn read_resource<'a>( &'a self, uri: &'a str, ctx: &'a RequestContext, ) -> impl Future<Output = McpResult<ResourceResult>> + MaybeSend + 'a

Reads a resource by URI. Read more
Source§

fn get_prompt<'a>( &'a self, name: &'a str, args: Option<Value>, ctx: &'a RequestContext, ) -> impl Future<Output = McpResult<PromptResult>> + MaybeSend + 'a

Gets a prompt by name with optional arguments. Read more
Source§

fn list_tasks<'a>( &'a self, _cursor: Option<&'a str>, _limit: Option<usize>, _ctx: &'a RequestContext, ) -> impl Future<Output = Result<ListTasksResult, McpError>> + MaybeSend + 'a

Lists all active and recent tasks. Read more
Source§

fn get_task<'a>( &'a self, _task_id: &'a str, _ctx: &'a RequestContext, ) -> impl Future<Output = Result<Task, McpError>> + MaybeSend + 'a

Gets the current state of a specific task. Read more
Source§

fn cancel_task<'a>( &'a self, _task_id: &'a str, _ctx: &'a RequestContext, ) -> impl Future<Output = Result<Task, McpError>> + MaybeSend + 'a

Cancels a running task. Read more
Source§

fn get_task_result<'a>( &'a self, _task_id: &'a str, _ctx: &'a RequestContext, ) -> impl Future<Output = Result<Value, McpError>> + MaybeSend + 'a

Gets the result of a completed task. Read more
Source§

fn on_initialize( &self, ) -> impl Future<Output = Result<(), McpError>> + MaybeSend

Called when the server is initialized. Read more
Source§

fn on_shutdown(&self) -> impl Future<Output = Result<(), McpError>> + MaybeSend

Called when the server is shutting down. 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<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

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> McpHandlerExt for T
where T: McpHandler,

Source§

fn run(&self) -> impl Future<Output = Result<(), McpError>> + Send

Run with the default transport (STDIO). Read more
Source§

fn run_stdio(&self) -> impl Future<Output = Result<(), McpError>> + Send

Run on STDIO transport (explicit, equivalent to run()).
Source§

fn handle_request( &self, request: Value, ctx: RequestContext, ) -> impl Future<Output = Result<Value, McpError>> + Send

Handle a single JSON-RPC request (for serverless environments). Read more
Source§

impl<T> McpServerExt for T
where T: McpHandler,

Source§

fn builder(self) -> ServerBuilder<Self>

Create a server builder for this handler. Read more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
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
Source§

impl<T> MaybeSend for T
where T: Send + ?Sized,

Source§

impl<T> MaybeSync for T
where T: Sync + ?Sized,