SharedServer

Struct SharedServer 

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

Thread-safe wrapper for sharing McpServer instances across async tasks

This wrapper encapsulates Arc/Mutex complexity and provides a clean API for concurrent access to server functionality. It addresses the limitations where server run methods consume self but configuration and monitoring need to be shared across multiple async tasks.

§Design Rationale

McpServer run methods consume self because:

  • They take ownership of the server to run the main event loop
  • Transport binding requires exclusive access
  • Graceful shutdown needs to control the entire server lifecycle

However, other operations like health checks, metrics, and configuration access need to be shared across multiple tasks for monitoring and management.

§Examples

use turbomcp_server::{McpServer, SharedServer, ServerConfig};

let config = ServerConfig::default();
let server = McpServer::new(config);
let shared = SharedServer::new(server);

// Clone for sharing across tasks
let shared1 = shared.clone();
let shared2 = shared.clone();

// Both tasks can access server state concurrently
let handle1 = tokio::spawn(async move {
    shared1.health().await
});

let handle2 = tokio::spawn(async move {
    let _handle = shared2.shutdown_handle();
    "shutdown_ready"
});

let (health, _shutdown_ready) = tokio::try_join!(handle1, handle2).unwrap();

// Run the server (consumes the shared server)
// shared.run_stdio().await?;

Implementations§

Source§

impl SharedServer

Source

pub fn new(server: McpServer) -> Self

Create a new shared server wrapper

Takes ownership of a McpServer and wraps it for thread-safe sharing. The original server can no longer be accessed directly after this call.

Source

pub async fn config(&self) -> Option<ServerConfig>

Get server configuration

Returns a clone of the server configuration.

Source

pub async fn registry(&self) -> Option<Arc<HandlerRegistry>>

Get handler registry

Returns a clone of the Arc to the handler registry.

Source

pub async fn router(&self) -> Option<Arc<RequestRouter>>

Get request router

Returns a clone of the Arc to the request router.

Source

pub async fn lifecycle(&self) -> Option<Arc<ServerLifecycle>>

Get server lifecycle

Returns a clone of the Arc to the server lifecycle.

Source

pub async fn metrics(&self) -> Option<Arc<ServerMetrics>>

Get server metrics

Returns a clone of the Arc to the server metrics.

Source

pub async fn shutdown_handle(&self) -> Option<ShutdownHandle>

Get a shutdown handle for graceful server termination

Returns a shutdown handle that can be used to gracefully terminate the server from external tasks.

Source

pub async fn health(&self) -> Option<HealthStatus>

Get health status

Returns the current health status of the server.

Source

pub async fn run_stdio(self) -> ServerResult<()>

Run the server with STDIO transport

This consumes the SharedServer and extracts the inner server to run it. After calling this method, the SharedServer can no longer be used.

Source

pub async fn is_available(&self) -> bool

Check if the server is still available (hasn’t been consumed)

Trait Implementations§

Source§

impl Clone for SharedServer

Source§

fn clone(&self) -> Self

Clone the shared server for use in multiple async tasks

This creates a new reference to the same underlying server, allowing multiple tasks to share access safely.

1.0.0 · Source§

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

Performs copy-assignment from source. Read more
Source§

impl Debug for SharedServer

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<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> 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> ErasedDestructor for T
where T: 'static,