Message Observer
The McpObserver trait provides a non-blocking hook for intercepting all MCP messages flowing through a server or client.
use std::sync::Arc;
use rust_mcp_sdk::{
McpObserver,
mcp_server::{McpServerOptions, server_runtime},
schema::schema_utils::{ClientMessage, ServerMessage},
};
struct SimpleObserver;
impl McpObserver<ClientMessage, ServerMessage> for SimpleObserver {
fn on_receive(&self, message: &ClientMessage) {
println!("โ received: {message:?}");
}
fn on_send(&self, message: &ServerMessage) {
println!("โ sent: {message:?}");
}
}
Both callbacks are synchronous and run in the critical message path - keep them fast (a few milliseconds at most) and non-blocking. For slow work such as network calls, spawn a task instead.
Attach the observer during server creation:
let server = server_runtime::create_server(McpServerOptions {
server_details,
transport,
handler: handler.to_mcp_server_handler(),
task_store: None,
client_task_store: None,
// stored as Arc<dyn McpObserver<ClientMessage, ServerMessage>>
message_observer: Some(Arc::new(SimpleObserver)),
});
See example implementations in examples/common/server_observer.rs and client_observer.rs.