Skip to main content
Version: 1.1.0

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.