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
50//!
51//! The server 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
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_protocol::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//!             metadata: None,
79//!         }],
80//!         max_tokens: 50,
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//!         _meta: None,
87//!     };
88//!
89//!     // Send the request to the client
90//!     let result = ctx.create_message(request).await?;
91//!     Ok(format!("Response: {:?}", result))
92//! }
93//! ```
94//!
95//! **Sampling Features:**
96//! - Client-side sampling configuration support
97//! - Server-side sampling metadata tracking
98//! - Integration with elicitation for dynamic sampling decisions
99//! - Configurable timeouts and retry logic
100//!
101//! ## Compile-Time Routing (Experimental)
102//!
103//! Zero-cost compile-time router generation for high-throughput scenarios:
104//!
105//! - Zero-cost compile-time router generation
106//! - Type-safe route matching at compile time
107//! - Automatic handler registration through macros
108//! - Performance optimization for high-throughput scenarios
109//!
110//! *Note: Compile-time routing is experimental and may have limitations with some MCP protocol methods.*
111
112#![deny(missing_docs)]
113#![warn(missing_debug_implementations)]
114#![warn(clippy::all)]
115#![allow(
116    clippy::module_name_repetitions,
117    clippy::missing_errors_doc,  // Error documentation in progress
118    clippy::must_use_candidate,  // Too pedantic for library APIs
119    clippy::return_self_not_must_use,  // Constructor methods don't need must_use
120    clippy::struct_excessive_bools,  // Sometimes bools are the right design
121    clippy::missing_panics_doc,  // Panic docs added where genuinely needed
122    clippy::default_trait_access  // Default::default() is sometimes clearer
123)]
124
125// Sprint 2.7: Compile-time security warnings for dangerous feature combinations
126//
127// Note: These are placeholder warnings for future security features:
128// - dpop-ed25519: EdDSA-based DPoP (more secure than RS256)
129// - tls: TLS/HTTPS support (recommended for production HTTP servers)
130//
131// When these features are added, uncomment the checks below:
132//
133// #[cfg(all(feature = "dpop", not(feature = "dpop-ed25519")))]
134// compile_error!("DPoP should use EdDSA or ES256, not RS256");
135//
136// #[cfg(all(feature = "http", not(feature = "tls")))]
137// const _HTTP_TLS_WARNING: () = ();
138
139/// Server name
140pub const SERVER_NAME: &str = "turbomcp-server";
141/// Server version
142pub const SERVER_VERSION: &str = env!("CARGO_PKG_VERSION");
143
144pub mod capabilities;
145pub mod config;
146pub mod elicitation;
147pub mod error;
148pub mod error_sanitization; // Sprint 3.1: Error message sanitization
149pub mod handler_validation;
150pub mod handlers; // Sprint 2.4: Handler name injection prevention
151// Temporarily disabled - compile-time routing replaces these
152// #[cfg(feature = "http")]
153// pub mod http_server;
154pub mod lifecycle;
155pub mod metrics;
156#[cfg(feature = "middleware")]
157pub mod middleware;
158pub mod observability;
159pub mod registry;
160pub mod routing;
161pub mod runtime;
162pub mod sampling;
163pub mod security_checks; // Sprint 2.6: Runtime security validation
164pub mod server;
165pub mod service;
166pub mod timeout;
167// #[cfg(feature = "http")]
168// pub mod simple_http;
169
170// Re-export main types for convenience
171pub use config::{Configuration, ConfigurationBuilder, ServerConfig};
172pub use error::{ServerError, ServerResult};
173pub use handlers::{
174    CompletionHandler, ElicitationHandler, LoggingHandler, PingHandler, PromptHandler,
175    ResourceHandler, ResourceTemplateHandler, SamplingHandler, ToolHandler,
176};
177pub use lifecycle::{HealthStatus, ServerLifecycle, ShutdownSignal};
178pub use metrics::{MetricsCollector, ServerMetrics};
179
180// Re-export middleware components (feature-gated)
181#[cfg(feature = "middleware")]
182pub use middleware::{
183    AuditConfig, AuditLayer, MiddlewareStack, SecurityConfig, SecurityLayer, TimeoutConfig,
184    TimeoutLayer, ValidationConfig, ValidationLayer,
185};
186
187#[cfg(all(feature = "middleware", feature = "auth"))]
188#[allow(deprecated)]
189pub use middleware::{AuthConfig, AuthLayer, Claims};
190
191#[cfg(all(feature = "middleware", feature = "rate-limiting"))]
192pub use middleware::{RateLimitConfig, RateLimitLayer};
193pub use observability::{
194    ObservabilityConfig, ObservabilityGuard, OtlpProtocol, PerformanceMonitor, SamplingConfig,
195    SecurityAuditLogger, global_observability,
196};
197pub use registry::{HandlerRegistry, Registry, RegistryBuilder};
198pub use routing::{RequestRouter, Route, Router};
199pub use server::{McpServer, ServerBuilder, ShutdownHandle};
200
201// Re-export protocol types
202pub use turbomcp_protocol::jsonrpc::{
203    JsonRpcError, JsonRpcRequest, JsonRpcResponse, JsonRpcVersion,
204};
205pub use turbomcp_protocol::types::{CallToolRequest, CallToolResult, ListToolsResult, Tool};
206pub use turbomcp_protocol::types::{ClientCapabilities, ServerCapabilities};
207
208// Re-export core functionality
209pub use turbomcp_protocol::{MessageId, RequestContext};
210
211// Elicitation support
212pub use elicitation::{ElicitationCoordinator, ElicitationTransport, SharedElicitationCoordinator};
213
214// Transport configuration (for ergonomic access)
215#[cfg(feature = "websocket")]
216pub use config::WebSocketServerConfig;
217
218/// Default server configuration
219#[must_use]
220pub fn default_config() -> ServerConfig {
221    ServerConfig::default()
222}
223
224/// Create a new server builder
225#[must_use]
226pub fn server() -> ServerBuilder {
227    ServerBuilder::new()
228}
229
230/// Prelude for common server functionality
231pub mod prelude {
232    // Core types (always available)
233    pub use crate::{
234        HealthStatus, McpServer, PromptHandler, Registry, RegistryBuilder, RequestRouter,
235        ResourceHandler, Router, SamplingHandler, ServerBuilder, ServerConfig, ServerError,
236        ServerLifecycle, ServerResult, ToolHandler, default_config, server,
237    };
238
239    // Middleware types (requires middleware feature)
240    #[cfg(feature = "middleware")]
241    pub use crate::{
242        AuditConfig, AuditLayer, MiddlewareStack, SecurityConfig, SecurityLayer, TimeoutConfig,
243        TimeoutLayer, ValidationConfig, ValidationLayer,
244    };
245
246    // Auth middleware (requires middleware + auth features)
247    #[cfg(all(feature = "middleware", feature = "auth"))]
248    #[allow(deprecated)]
249    pub use crate::{AuthConfig, AuthLayer, Claims};
250
251    // Rate limiting middleware (requires middleware + rate-limiting features)
252    #[cfg(all(feature = "middleware", feature = "rate-limiting"))]
253    pub use crate::{RateLimitConfig, RateLimitLayer};
254
255    // Re-export macros
256    pub use turbomcp_macros::{prompt, resource, server as server_macro, tool};
257}