Struct StdioTransport

Source
pub struct StdioTransport { /* private fields */ }
Expand description

A transport implementation that uses standard input/output for communication.

This transport is suitable for scenarios where the client and server communicate through stdin/stdout, such as command-line applications or local development.

§Thread Safety

The implementation is thread-safe, using Arc and Mutex to protect shared access to stdin/stdout. This allows the transport to be used safely across multiple threads in an async context.

§Message Flow

  • Input: Messages are read line by line from stdin, parsed as JSON-RPC messages
  • Output: Messages are serialized to JSON and written to stdout

§Example

use mcp_sdk_rs::transport::stdio::StdioTransport;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let transport = StdioTransport::new();
    Ok(())
}

Implementations§

Source§

impl StdioTransport

Source

pub fn new() -> (Self, Sender<Result<Message, Error>>)

Creates a new stdio transport instance using actual stdin/stdout.

Trait Implementations§

Source§

impl Transport for StdioTransport

Source§

fn send<'life0, 'async_trait>( &'life0 self, message: Message, ) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Sends a message by writing it to stdout.

§Arguments
  • message - The message to send
§Returns

Returns Ok(()) if the message was successfully written to stdout, or an error if the write failed or stdout was locked.

§Errors

This function will return an error if:

  • Failed to acquire the stdout lock
  • Failed to serialize the message to JSON
  • Failed to write to stdout
  • Failed to flush stdout
Source§

fn receive(&self) -> Pin<Box<dyn Stream<Item = Result<Message, Error>> + Send>>

Creates a stream of messages received from stdin.

§Returns

Returns a pinned box containing a stream that yields Result<Message, Error>. The stream will continue until stdin is closed or an error occurs.

§Message Flow
  1. Messages are read from stdin in the background task created in new()
  2. Each message is sent through the broadcast channel
  3. This stream receives messages from the broadcast channel
Source§

fn close<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Closes the transport.

For stdio transport, this is a no-op as we don’t own stdin/stdout.

§Returns

Always returns Ok(()).

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> ErasedDestructor for T
where T: 'static,

Source§

impl<T> MaybeSendSync for T