36 lines · 1.3 KB · Rust
RawDownload
pub mod http;mod stdio_transport; use anyhow::Result;use async_trait::async_trait;use futures::Stream;use std::pin::Pin; use crate::oauth::WwwAuthenticate; pub use http::*;pub use stdio_transport::*; #[async_trait]pub trait Transport: Send + Sync {    async fn send(&self, message: String) -> Result<()>;    fn receive(&self) -> Pin<Box<dyn Stream<Item = String> + Send>>;    fn receive_err(&self) -> Pin<Box<dyn Stream<Item = String> + Send>>;     /// Called after the MCP initialize handshake completes so transports that    /// need the negotiated version (currently only HTTP, which must attach an    /// `MCP-Protocol-Version` header from 2025-06-18 onward) can pick it up.    fn set_protocol_version(&self, _version: &str) {}     /// The authentication challenge from the last `401 Unauthorized` response    /// this transport gave up on, if any (currently only set by the HTTP    /// transport).    ///    /// The challenge is recorded right before the failed send tears down the    /// client's output loop. Observers of the client's shutdown read it from    /// here, so a 401 can initiate the OAuth flow even when it arrived on a    /// notification, with no request in flight to carry a typed error.    fn auth_challenge(&self) -> Option<WwwAuthenticate> {        None    }}