turbomcp_server/lib.rs
1//! # TurboMCP Server
2//!
3//! MCP (Model Context Protocol) server implementation with graceful shutdown,
4//! routing, lifecycle management, and comprehensive observability features.
5//!
6//! ## Features
7//!
8//! - **Roots Configuration** - Configurable filesystem roots via builder API or macro
9//! - **Elicitation Support** - Server-initiated requests for interactive user input
10//! - **Sampling Protocol** - Bidirectional LLM sampling with client interaction
11//! - **Graceful Shutdown** - Shutdown handling with signal support
12//! - **Multi-Transport** - STDIO, TCP, Unix, WebSocket, HTTP/SSE support
13//! - **Middleware Stack** - Authentication, rate limiting, and security headers
14//! - **Request Routing** - Efficient handler registration and dispatch
15//! - **Health Monitoring** - Comprehensive health checks and metrics
16//! - **Error Recovery** - Robust error handling and recovery mechanisms
17//! - **MCP Compliance** - Full support for tools, prompts, resources, roots, sampling, and elicitation
18//! - **Server-Initiated Requests** - Support for sampling and elicitation via `ServerCapabilities`
19//!
20//! ## Example
21//!
22//! ```no_run
23//! use turbomcp_server::ServerBuilder;
24//! use turbomcp_protocol::types::Root;
25//! use tokio::signal;
26//!
27//! #[tokio::main]
28//! async fn main() -> Result<(), Box<dyn std::error::Error>> {
29//! let server = ServerBuilder::new()
30//! .name("MyServer")
31//! .version("1.0.0")
32//! // Configure filesystem roots
33//! .root("file:///workspace", Some("Workspace".to_string()))
34//! .root("file:///tmp", Some("Temp".to_string()))
35//! .build();
36//!
37//! // Get shutdown handle for graceful termination
38//! let shutdown_handle = server.shutdown_handle();
39//!
40//! // In production: spawn server and wait for shutdown
41//! // tokio::spawn(async move { server.run_stdio().await });
42//! // signal::ctrl_c().await?;
43//! // shutdown_handle.shutdown().await;
44//!
45//! Ok(())
46//! }
47//! ```
48//!
49//! ## Elicitation Support (New in 1.0.3)
50//!
51//! The server now includes comprehensive elicitation support for interactive user input:
52//!
53//! - `ElicitationCoordinator` for managing elicitation lifecycle
54//! - Request/response correlation with timeouts
55//! - Retry logic with configurable attempts
56//! - Priority-based request queuing
57//! - Automatic cleanup of expired requests
58//!
59//! ## Sampling Support (New in 1.0.3)
60//!
61//! The server provides built-in support for server-initiated sampling requests to clients:
62//!
63//! ```rust,no_run
64//! use turbomcp_server::sampling::SamplingExt;
65//! use turbomcp_core::RequestContext;
66//! use turbomcp_protocol::types::{CreateMessageRequest, SamplingMessage, Role, Content, TextContent};
67//!
68//! async fn my_tool(ctx: RequestContext) -> Result<String, Box<dyn std::error::Error>> {
69//! // Create a sampling request
70//! let request = CreateMessageRequest {
71//! messages: vec![SamplingMessage {
72//! role: Role::User,
73//! content: Content::Text(TextContent {
74//! text: "What is 2+2?".to_string(),
75//! annotations: None,
76//! meta: None,
77//! }),
78//! }],
79//! max_tokens: 50,
80//! // ... other fields
81//! # model_preferences: None,
82//! # system_prompt: Some("You are a helpful math assistant.".to_string()),
83//! # include_context: Some(turbomcp_protocol::types::IncludeContext::None),
84//! # temperature: Some(0.7),
85//! # stop_sequences: None,
86//! # metadata: None,
87//! # _meta: None,
88//! };
89//!
90//! // Send the request to the client
91//! let result = ctx.create_message(request).await?;
92//! Ok(format!("Response: {:?}", result))
93//! }
94//! ```
95//!
96//! **Sampling Features:**
97//! - Client-side sampling configuration support
98//! - Server-side sampling metadata tracking
99//! - Integration with elicitation for dynamic sampling decisions
100//! - Configurable timeouts and retry logic
101//!
102//! ## Compile-Time Routing (Experimental - New in 1.0.3)
103//!
104//! Zero-cost compile-time router generation for high-throughput scenarios:
105//!
106//! - Zero-cost compile-time router generation
107//! - Type-safe route matching at compile time
108//! - Automatic handler registration through macros
109//! - Performance optimization for high-throughput scenarios
110//!
111//! *Note: Compile-time routing is experimental and may have limitations with some MCP protocol methods.*
112
113#![deny(missing_docs)]
114#![warn(missing_debug_implementations)]
115#![warn(clippy::all)]
116#![allow(
117 clippy::module_name_repetitions,
118 clippy::missing_errors_doc, // Error documentation in progress
119 clippy::must_use_candidate, // Too pedantic for library APIs
120 clippy::return_self_not_must_use, // Constructor methods don't need must_use
121 clippy::struct_excessive_bools, // Sometimes bools are the right design
122 clippy::missing_panics_doc, // Panic docs added where genuinely needed
123 clippy::default_trait_access // Default::default() is sometimes clearer
124)]
125
126/// Server name
127pub const SERVER_NAME: &str = "turbomcp-server";
128/// Server version
129pub const SERVER_VERSION: &str = env!("CARGO_PKG_VERSION");
130
131pub mod config;
132pub mod elicitation;
133pub mod error;
134pub mod handlers;
135// Temporarily disabled - compile-time routing replaces these
136// #[cfg(feature = "http")]
137// pub mod http_server;
138pub mod lifecycle;
139pub mod metrics;
140pub mod middleware;
141pub mod registry;
142pub mod routing;
143pub mod sampling;
144pub mod server;
145pub mod shared;
146// #[cfg(feature = "http")]
147// pub mod simple_http;
148
149// Re-export main types for convenience
150pub use config::{Configuration, ConfigurationBuilder, ServerConfig};
151pub use error::{ServerError, ServerResult};
152pub use handlers::{
153 CompletionHandler, ElicitationHandler, LoggingHandler, PingHandler, PromptHandler,
154 ResourceHandler, ResourceTemplateHandler, SamplingHandler, ToolHandler,
155};
156pub use lifecycle::{HealthStatus, ServerLifecycle, ShutdownSignal};
157pub use metrics::{MetricsCollector, ServerMetrics};
158pub use middleware::{
159 AuthenticationMiddleware, LoggingMiddleware, Middleware, MiddlewareLayer, MiddlewareStack,
160 RateLimitMiddleware, SecurityHeadersConfig, SecurityHeadersMiddleware,
161};
162pub use registry::{HandlerRegistry, Registry, RegistryBuilder};
163pub use routing::{RequestRouter, Route, Router};
164pub use server::{McpServer, ServerBuilder, ShutdownHandle};
165pub use shared::SharedServer;
166
167// Re-export protocol types
168pub use turbomcp_protocol::jsonrpc::{
169 JsonRpcError, JsonRpcRequest, JsonRpcResponse, JsonRpcVersion,
170};
171pub use turbomcp_protocol::types::{CallToolRequest, CallToolResult, ListToolsResult, Tool};
172pub use turbomcp_protocol::types::{ClientCapabilities, ServerCapabilities};
173
174// Re-export core functionality
175pub use turbomcp_core::{MessageId, RequestContext};
176
177// Elicitation support
178pub use elicitation::{ElicitationCoordinator, ElicitationTransport, SharedElicitationCoordinator};
179
180/// Default server configuration
181#[must_use]
182pub fn default_config() -> ServerConfig {
183 ServerConfig::default()
184}
185
186/// Create a new server builder
187#[must_use]
188pub fn server() -> ServerBuilder {
189 ServerBuilder::new()
190}
191
192/// Prelude for common server functionality
193pub mod prelude {
194 pub use crate::{
195 AuthenticationMiddleware, HealthStatus, LoggingMiddleware, McpServer, Middleware,
196 MiddlewareStack, PromptHandler, RateLimitMiddleware, Registry, RegistryBuilder,
197 RequestRouter, ResourceHandler, Router, SamplingHandler, SecurityHeadersConfig,
198 SecurityHeadersMiddleware, ServerBuilder, ServerConfig, ServerError, ServerLifecycle,
199 ServerResult, ToolHandler, default_config, server,
200 };
201
202 // Re-export macros
203 pub use turbomcp_macros::{prompt, resource, server as server_macro, tool};
204}