Skip to main content

UnifiedMcpServer

Struct UnifiedMcpServer 

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

A unified MCP server that aggregates multiple tools

The UnifiedMcpServer implements the ToolProtocol trait and routes tool execution requests to the appropriate underlying tool protocol implementation based on the tool name.

This allows a single server instance to expose multiple tools with different implementations, making it suitable for deployment as an MCP HTTP service that can be accessed by multiple agents.

§Thread Safety

The server is thread-safe and can be shared across multiple concurrent tool executions using Arc<UnifiedMcpServer>.

Implementations§

Source§

impl UnifiedMcpServer

Source

pub fn new() -> Self

Create a new empty unified MCP server

Source

pub async fn register_tool( &mut self, tool_name: &str, protocol: Arc<dyn ToolProtocol>, )

Register a tool with the server

§Arguments
  • tool_name - The identifier for the tool (e.g., “memory”, “bash”)
  • protocol - The ToolProtocol implementation for this tool
§Example
use cloudllm::mcp_server::UnifiedMcpServer;
use cloudllm::tools::Memory;
use cloudllm::tool_protocols::MemoryProtocol;
use std::sync::Arc;

let memory = Arc::new(Memory::new());
let memory_protocol = Arc::new(MemoryProtocol::new(memory));

let mut server = UnifiedMcpServer::new();
server.register_tool("memory", memory_protocol).await;
Source

pub async fn unregister_tool(&mut self, tool_name: &str)

Unregister a tool from the server

Source

pub async fn has_tool(&self, tool_name: &str) -> bool

Check if a tool is registered

Source

pub async fn tool_count(&self) -> usize

Get the number of registered tools

Trait Implementations§

Source§

impl Clone for UnifiedMcpServer

Source§

fn clone(&self) -> UnifiedMcpServer

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 Default for UnifiedMcpServer

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl ToolProtocol for UnifiedMcpServer

Source§

fn execute<'life0, 'life1, 'async_trait>( &'life0 self, tool_name: &'life1 str, parameters: Value, ) -> Pin<Box<dyn Future<Output = Result<ToolResult, Box<dyn Error + Send + Sync>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Execute a tool by routing to the appropriate protocol

§Routing Logic
  1. Look up the tool name in the registry
  2. If found, delegate to that tool’s protocol
  3. If not found, return NotFound error
Source§

fn list_tools<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<Vec<ToolMetadata>, Box<dyn Error + Send + Sync>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

List all available tools across all registered protocols

This aggregates tool metadata from all registered tool protocols. Each protocol is queried at most once even if multiple tool names are registered to the same protocol instance.

Source§

fn get_tool_metadata<'life0, 'life1, 'async_trait>( &'life0 self, tool_name: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<ToolMetadata, Box<dyn Error + Send + Sync>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Get metadata for a specific tool

This searches across all registered protocols to find the tool.

Source§

fn protocol_name(&self) -> &str

Protocol identifier

Source§

fn initialize<'life0, 'async_trait>( &'life0 mut self, ) -> Pin<Box<dyn Future<Output = Result<(), Box<dyn Error + Send + Sync>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Initialize the server (initializes all registered protocols)

Source§

fn shutdown<'life0, 'async_trait>( &'life0 mut self, ) -> Pin<Box<dyn Future<Output = Result<(), Box<dyn Error + Send + Sync>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Shutdown the server (shuts down all registered protocols)

Source§

fn list_resources<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<Vec<ResourceMetadata>, Box<dyn Error + Send + Sync>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

List available resources (MCP Resource support) Read more
Source§

fn read_resource<'life0, 'life1, 'async_trait>( &'life0 self, uri: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<String, Box<dyn Error + Send + Sync>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Read the content of a resource by URI (MCP Resource support) Read more
Source§

fn supports_resources(&self) -> bool

Check if this protocol supports resources

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