mcp_transport_rs/server/
sse.rs

1use std::io;
2
3use async_trait::async_trait;
4use mcp_core_rs::protocol::message::JsonRpcMessage;
5use mcp_error_rs::{Error, Result};
6use tokio::sync::mpsc::{UnboundedReceiver, UnboundedSender};
7
8use crate::server::traits::ServerTransport;
9
10/// A transport that wraps an SSE-style message sender
11pub struct SseTransport {
12    sender: UnboundedSender<JsonRpcMessage>,
13    receiver: UnboundedReceiver<JsonRpcMessage>,
14}
15
16impl SseTransport {
17    pub fn new(
18        sender: UnboundedSender<JsonRpcMessage>,
19        receiver: UnboundedReceiver<JsonRpcMessage>,
20    ) -> Self {
21        Self { sender, receiver }
22    }
23}
24
25#[async_trait]
26impl ServerTransport for SseTransport {
27    async fn write_message(&mut self, msg: JsonRpcMessage) -> Result<()> {
28        self.sender
29            .send(msg)
30            .map_err(|_| Error::Io(io::Error::new(io::ErrorKind::BrokenPipe, "SSE send failed")))
31    }
32
33    async fn read_message(&mut self) -> Option<Result<JsonRpcMessage>> {
34        self.receiver.recv().await.map(Ok)
35    }
36}