McpServer

Struct McpServer 

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

Main MCP server following the Axum/Tower Clone pattern

§Sharing Pattern

McpServer implements Clone like Axum’s Router. All heavy state is Arc-wrapped internally, making cloning cheap (just atomic reference count increments).

use turbomcp_server::ServerBuilder;

let server = ServerBuilder::new().build();

// Clone for passing to functions (cheap - just Arc increments)
let server1 = server.clone();
let server2 = server.clone();

// Access config and health
let config = server1.config();
println!("Server: {}", config.name);

let health = server2.health().await;
println!("Health: {:?}", health);

§Architecture Notes

The service field contains BoxCloneService which is Send + Clone but NOT Sync. This is intentional and follows Tower’s design - users clone the server instead of Arc-wrapping it.

Architecture Note: The service field provides tower::Service integration for advanced middleware patterns. The request processing pipeline currently uses the RequestRouter directly. Tower integration can be added via custom middleware layers when needed for specific use cases (e.g., custom rate limiting, advanced tracing).

Implementations§

Source§

impl McpServer

Source

pub fn new(config: ServerConfig) -> Self

Create a new server

Source

pub const fn config(&self) -> &ServerConfig

Get server configuration

Source

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

Get handler registry

Source

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

Get request router

Source

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

Get server lifecycle

Source

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

Get server metrics

Source

pub fn shutdown_handle(&self) -> ShutdownHandle

Get a shutdown handle for graceful server termination

This handle enables external control over server shutdown, essential for:

  • Production deployments: Graceful shutdown on SIGTERM/SIGINT
  • Container orchestration: Kubernetes graceful pod termination
  • Load balancer integration: Health check coordination
  • Multi-component systems: Coordinated shutdown sequences
  • Maintenance operations: Planned downtime and updates
§Examples
§Basic shutdown coordination
let server = ServerBuilder::new().build();
let shutdown_handle = server.shutdown_handle();

// Coordinate with other services
tokio::spawn(async move {
    // Wait for external shutdown signal
    tokio::signal::ctrl_c().await.expect("Failed to install Ctrl+C handler");
    println!("Shutdown signal received, terminating gracefully...");
    shutdown_handle.shutdown().await;
});

// Server will gracefully shut down when signaled
// server.run_stdio().await?;
§Container/Kubernetes deployment
let server = ServerBuilder::new().build();
let shutdown_handle = server.shutdown_handle();
let shutdown_handle_clone = shutdown_handle.clone();

// Handle multiple signal types with proper platform support
tokio::spawn(async move {
    #[cfg(unix)]
    {
        use tokio::signal::unix::{signal, SignalKind};
        let mut sigterm = signal(SignalKind::terminate()).unwrap();
        tokio::select! {
            _ = tokio::signal::ctrl_c() => {
                println!("SIGINT received");
            }
            _ = sigterm.recv() => {
                println!("SIGTERM received");
            }
        }
    }
    #[cfg(not(unix))]
    {
        tokio::signal::ctrl_c().await.expect("Failed to install Ctrl+C handler");
        println!("SIGINT received");
    }
    shutdown_handle_clone.shutdown().await;
});

// Server handles graceful shutdown automatically
// server.run_tcp("0.0.0.0:8080").await?;
Source

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

Run the server with STDIO transport

§Errors

Returns crate::ServerError::Transport if:

  • STDIO transport connection fails
  • Message sending/receiving fails
  • Transport disconnection fails
Source

pub async fn health(&self) -> HealthStatus

Get health status

Trait Implementations§

Source§

impl Clone for McpServer

Source§

fn clone(&self) -> McpServer

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 McpServer

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