Skip to main content

McpServer

Struct McpServer 

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

In-process MCP server that owns registered tools, resources, and prompts.

Implementations§

Source§

impl McpServer

Source

pub fn new( server_name: impl Into<Cow<'static, str>>, server_version: impl Into<Cow<'static, str>>, ) -> Self

Create a dynamic MCP tool server with the advertised metadata.

Source

pub fn builder( server_name: impl Into<Cow<'static, str>>, server_version: impl Into<Cow<'static, str>>, ) -> McpServerBuilder

Start building a dynamic MCP tool server with generated registrars.

Source

pub fn from_tool_registry( server_name: impl Into<Cow<'static, str>>, server_version: impl Into<Cow<'static, str>>, tools: McpToolRegistry, ) -> Self

Create a dynamic MCP server from an existing tool registry.

Source

pub fn tool_registry(&self) -> &McpToolRegistry

Borrow the shared tool registry.

Source

pub fn tool_registry_mut(&mut self) -> &mut McpToolRegistry

Mutably borrow the shared tool registry.

Source

pub fn into_tool_registry(self) -> McpToolRegistry

Consume the server and return its tool registry.

Source

pub fn add_tool<Call>( &mut self, definition: ToolDefinition, call: Call, ) -> Result<(), McpToolError>
where Call: Fn(McpToolCall) -> ToolCallResult + Send + Sync + 'static,

Register a synchronous MCP tool handler.

§Errors

Returns McpToolError when definition is invalid or a tool with the same name is already registered.

Source

pub fn add_typed_tool<Input, Call>( &mut self, definition: McpTypedTool<Input>, call: Call, ) -> Result<(), McpToolError>
where Input: McpToolInput, Call: Fn(Input) -> ToolCallResult + Send + Sync + 'static,

Register a synchronous typed MCP tool handler.

§Errors

Returns McpToolError when definition is invalid or a tool with the same name is already registered.

Source

pub fn add_koruma_tool<Input, Call>( &mut self, definition: McpTypedTool<Input>, call: Call, ) -> Result<(), McpToolError>
where Input: McpToolInput + ValidateExt, Input::Error: ValidationIssues, Call: Fn(Input) -> ToolCallResult + Send + Sync + 'static,

Register a typed handler with Koruma validation before dispatch.

§Errors

Returns McpToolError for an invalid or duplicate tool definition.

Source

pub fn add_tool_async<Call, Fut>( &mut self, definition: ToolDefinition, call: Call, ) -> Result<(), McpToolError>
where Call: Fn(McpToolCall) -> Fut + Send + Sync + 'static, Fut: Future<Output = ToolCallResult> + Send + 'static,

Register an async MCP tool handler.

§Errors

Returns McpToolError when definition is invalid or a tool with the same name is already registered.

Source

pub fn add_typed_tool_async<Input, Call, Fut>( &mut self, definition: McpTypedTool<Input>, call: Call, ) -> Result<(), McpToolError>
where Input: McpToolInput, Call: Fn(Input) -> Fut + Send + Sync + 'static, Fut: Future<Output = ToolCallResult> + Send + 'static,

Register an async typed MCP tool handler.

§Errors

Returns McpToolError when definition is invalid or a tool with the same name is already registered.

Source

pub fn add_koruma_tool_async<Input, Call, Fut>( &mut self, definition: McpTypedTool<Input>, call: Call, ) -> Result<(), McpToolError>
where Input: McpToolInput + ValidateExt, Input::Error: ValidationIssues, Call: Fn(Input) -> Fut + Send + Sync + 'static, Fut: Future<Output = ToolCallResult> + Send + 'static,

Register an async typed handler with Koruma validation before dispatch.

§Errors

Returns McpToolError for an invalid or duplicate tool definition.

Source

pub fn list_tools(&self) -> Vec<ToolDefinition>

Return registered MCP tool definitions.

Source

pub fn contains_tool(&self, name: &str) -> bool

Whether a tool name is already registered.

Source

pub fn tool_count(&self) -> usize

Number of registered tools.

Source

pub fn add_resource<Read>( &mut self, definition: ResourceDefinition, read: Read, ) -> Result<(), McpToolError>
where Read: Fn() -> ReadResourceResult + Send + Sync + 'static,

Register a static MCP resource reader.

§Errors

Returns McpToolError when definition is invalid or a resource with the same URI is already registered.

Source

pub fn add_resource_async<Read, Fut>( &mut self, definition: ResourceDefinition, read: Read, ) -> Result<(), McpToolError>
where Read: Fn() -> Fut + Send + Sync + 'static, Fut: Future<Output = Result<ReadResourceResult, ErrorData>> + Send + 'static,

Register an async MCP resource reader.

§Errors

Returns McpToolError when definition is invalid or a resource with the same URI is already registered.

Source

pub fn add_resource_template( &mut self, definition: ResourceTemplateDefinition, ) -> Result<(), McpToolError>

Register an MCP resource template advertised by resources/templates/list.

§Errors

Returns McpToolError when definition is invalid.

Source

pub fn list_resources(&self) -> Vec<ResourceDefinition>

Return registered MCP resource definitions.

Source

pub fn list_resource_templates(&self) -> Vec<ResourceTemplateDefinition>

Return registered MCP resource template definitions.

Source

pub fn contains_resource(&self, uri: &str) -> bool

Whether a resource URI is already registered.

Source

pub fn resource_count(&self) -> usize

Number of registered concrete resources.

Source

pub fn add_prompt<Get>( &mut self, definition: PromptDefinition, get: Get, ) -> Result<(), McpToolError>
where Get: Fn(Option<JsonObject>) -> GetPromptResult + Send + Sync + 'static,

Register a static MCP prompt.

§Errors

Returns McpToolError when definition is invalid or a prompt with the same name is already registered.

Source

pub fn add_prompt_async<Get, Fut>( &mut self, definition: PromptDefinition, get: Get, ) -> Result<(), McpToolError>
where Get: Fn(Option<JsonObject>) -> Fut + Send + Sync + 'static, Fut: Future<Output = Result<GetPromptResult, ErrorData>> + Send + 'static,

Register an async MCP prompt.

§Errors

Returns McpToolError when definition is invalid or a prompt with the same name is already registered.

Source

pub fn list_prompts(&self) -> Vec<PromptDefinition>

Return registered MCP prompt definitions.

Source

pub fn contains_prompt(&self, name: &str) -> bool

Whether a prompt name is already registered.

Source

pub fn prompt_count(&self) -> usize

Number of registered prompts.

Source

pub fn call_tool(&self, name: &str, arguments: Option<Value>) -> ToolCallResult

Calls a registered tool and converts validation or handler failures into a protocol-level tool result.

Source

pub async fn call_tool_async( &self, name: &str, arguments: Option<Value>, ) -> ToolCallResult

Asynchronously calls a registered tool and converts validation or handler failures into a protocol-level tool result.

Source

pub async fn serve_stdio(self) -> ServeStdioResult

Serve this server over stdin/stdout using the MCP stdio transport.

§Errors

Returns an error when stdio serving fails or the service task fails.

Source

pub fn serve_stdio_blocking(self) -> ServeStdioResult

Serve this server over stdin/stdout on a new Tokio runtime.

§Errors

Returns an error when the Tokio runtime cannot be created, stdio serving fails, or the service task fails.

Trait Implementations§

Source§

impl Clone for McpServer

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

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

Performs copy-assignment from source. Read more
Source§

impl ServerHandler for McpServer

Source§

fn get_info(&self) -> ServerConfig

Source§

fn list_tools( &self, _request: Option<PaginatedRequestParams>, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<ListToolsResult, ErrorData>> + MaybeSendFuture + '_

Source§

fn get_tool(&self, name: &str) -> Option<Tool>

Get a tool definition by name. Read more
Source§

fn call_tool( &self, request: CallToolRequestParams, _context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<CallToolResponse, ErrorData>> + MaybeSendFuture + '_

Handle a tools/call request from a client. Read more
Source§

fn list_resources( &self, _request: Option<PaginatedRequestParams>, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<ListResourcesResult, ErrorData>> + MaybeSendFuture + '_

Source§

fn list_resource_templates( &self, _request: Option<PaginatedRequestParams>, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<ListResourceTemplatesResult, ErrorData>> + MaybeSendFuture + '_

Source§

fn read_resource( &self, request: ReadResourceRequestParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<ReadResourceResponse, ErrorData>> + MaybeSendFuture + '_

Source§

fn list_prompts( &self, _request: Option<PaginatedRequestParams>, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<ListPromptsResult, ErrorData>> + MaybeSendFuture + '_

Source§

fn get_prompt( &self, request: GetPromptRequestParams, _context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<GetPromptResponse, ErrorData>> + MaybeSendFuture + '_

Source§

fn ping( &self, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<(), ErrorData>> + MaybeSendFuture

Source§

fn initialize( &self, request: InitializeRequestParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<InitializeResult, ErrorData>> + MaybeSendFuture

Source§

fn negotiate_initialize( &self, request: &InitializeRequestParams, ) -> Result<InitializeResult, ErrorData>

Build the initialize response for request, negotiating the protocol version against Self::supported_protocol_versions. Read more
Source§

fn supported_protocol_versions(&self) -> Cow<'static, [ProtocolVersion]>

Return the protocol versions supported by this server. Read more
Source§

fn discover( &self, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<DiscoverResult, ErrorData>> + MaybeSendFuture

Return this server’s discovery information.
Source§

fn complete( &self, request: CompleteRequestParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<CompleteResult, ErrorData>> + MaybeSendFuture

Source§

fn set_level( &self, request: SetLevelRequestParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<(), ErrorData>> + MaybeSendFuture

Source§

fn accepted_subscription_filter( &self, requested: &SubscriptionFilter, ) -> Option<SubscriptionFilter>

Return the subset of a requested notification filter this server accepts. Read more
Source§

fn listen( &self, context: SubscriptionContext, ) -> impl Future<Output = Result<(), ErrorData>> + MaybeSendFuture

Run one established subscription until it is cancelled or closed gracefully. Read more
Source§

fn subscribe( &self, request: SubscribeRequestParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<(), ErrorData>> + MaybeSendFuture

👎Deprecated:

resources/subscribe is legacy-only; implement accepted_subscription_filter and listen for protocol version 2026-07-28

Source§

fn unsubscribe( &self, request: UnsubscribeRequestParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<(), ErrorData>> + MaybeSendFuture

👎Deprecated:

resources/unsubscribe is legacy-only; subscriptions/listen is cancelled through its request lifecycle

Source§

fn on_custom_request( &self, request: CustomRequest, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<CustomResult, ErrorData>> + MaybeSendFuture

Source§

fn on_cancelled( &self, notification: CancelledNotificationParam, context: NotificationContext<RoleServer>, ) -> impl Future<Output = ()> + MaybeSendFuture

Source§

fn on_progress( &self, notification: ProgressNotificationParam, context: NotificationContext<RoleServer>, ) -> impl Future<Output = ()> + MaybeSendFuture

Source§

fn on_initialized( &self, context: NotificationContext<RoleServer>, ) -> impl Future<Output = ()> + MaybeSendFuture

Source§

fn on_roots_list_changed( &self, context: NotificationContext<RoleServer>, ) -> impl Future<Output = ()> + MaybeSendFuture

Source§

fn on_custom_notification( &self, notification: CustomNotification, context: NotificationContext<RoleServer>, ) -> impl Future<Output = ()> + MaybeSendFuture

Source§

fn get_task( &self, request: GetTaskParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<GetTaskResult, ErrorData>> + MaybeSendFuture

SEP-2663 tasks/get: return the current DetailedTask state.
Source§

fn update_task( &self, request: UpdateTaskParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<(), ErrorData>> + MaybeSendFuture

SEP-2663 tasks/update: accept responses to outstanding in-task input requests. Returns an empty acknowledgement on success.
Source§

fn cancel_task( &self, request: CancelTaskParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<(), ErrorData>> + MaybeSendFuture

SEP-2663 tasks/cancel: cooperative cancellation. Returns an empty acknowledgement; the task’s observable status may lag.

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> 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<R, S> DynService<R> for S
where R: ServiceRole, S: Service<R>,

Source§

fn handle_request( &self, request: <R as ServiceRole>::PeerReq, context: RequestContext<R>, ) -> Pin<Box<dyn Future<Output = Result<<R as ServiceRole>::Resp, ErrorData>> + Send + '_>>

Source§

fn handle_notification( &self, notification: <R as ServiceRole>::PeerNot, context: NotificationContext<R>, ) -> Pin<Box<dyn Future<Output = Result<(), ErrorData>> + Send + '_>>

Source§

fn get_info(&self) -> <R as ServiceRole>::Info

Source§

fn supported_protocol_versions(&self) -> Cow<'static, [ProtocolVersion]>

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> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<H> Service<RoleServer> for H
where H: ServerHandler,

Source§

async fn handle_request( &self, request: <RoleServer as ServiceRole>::PeerReq, context: RequestContext<RoleServer>, ) -> Result<<RoleServer as ServiceRole>::Resp, ErrorData>

Source§

async fn handle_notification( &self, notification: <RoleServer as ServiceRole>::PeerNot, context: NotificationContext<RoleServer>, ) -> Result<(), ErrorData>

Source§

fn get_info(&self) -> <RoleServer as ServiceRole>::Info

Source§

fn supported_protocol_versions(&self) -> Cow<'static, [ProtocolVersion]>

The protocol versions this service can speak, bounding what initialize negotiation may agree to. Read more
Source§

impl<S> ServiceExt<RoleServer> for S
where S: Service<RoleServer>,

Source§

fn serve_with_ct<T, E, A>( self, transport: T, ct: CancellationToken, ) -> impl Future<Output = Result<RunningService<RoleServer, S>, ServerInitializeError>> + MaybeSendFuture
where T: IntoTransport<RoleServer, E, A>, E: Error + Send + Sync + 'static, S: Sized,

Source§

fn into_dyn(self) -> Box<dyn DynService<R>>

Convert this service to a dynamic boxed service Read more
Source§

fn serve<T, E, A>( self, transport: T, ) -> impl Future<Output = Result<RunningService<R, Self>, <R as ServiceRole>::InitializeError>> + MaybeSendFuture
where T: IntoTransport<R, E, A>, E: Error + Send + Sync + 'static, Self: Sized,

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 = !

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

fn try_from(value: U) -> Result<T, !>

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