Skip to main content

lean_ctx/server/
progress.rs

1use rmcp::model::{ProgressNotificationParam, ProgressToken};
2use rmcp::service::Peer;
3use rmcp::RoleServer;
4
5/// Sends MCP progress notifications to the client during long-running tool operations.
6#[derive(Clone)]
7pub struct ProgressSender {
8    peer: Peer<RoleServer>,
9    token: ProgressToken,
10}
11
12impl ProgressSender {
13    pub fn new(peer: Peer<RoleServer>, token: ProgressToken) -> Self {
14        Self { peer, token }
15    }
16
17    pub fn send(&self, progress: f64, total: Option<f64>, message: Option<String>) {
18        let params = ProgressNotificationParam {
19            progress_token: self.token.clone(),
20            progress,
21            total,
22            message,
23        };
24        let peer = self.peer.clone();
25        tokio::spawn(async move {
26            if let Err(e) = peer.notify_progress(params).await {
27                tracing::debug!("[progress] notify failed: {e}");
28            }
29        });
30    }
31}
32
33pub type SharedProgressSender = std::sync::Arc<std::sync::Mutex<Option<ProgressSender>>>;