Struct ClientStdioTransport

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

Client transport that communicates with an MCP server over standard I/O.

The ClientStdioTransport launches a child process specified by the provided program and arguments, then communicates with it using the standard input and output streams. It implements the Transport trait to send requests and receive responses over these streams.

This transport is useful for:

  • Running local MCP servers as child processes
  • Command-line tools that need to communicate with MCP servers
  • Testing and development scenarios

§Example

use mcp_core::transport::{ClientStdioTransport, Transport};
use anyhow::Result;

async fn example() -> Result<()> {
    let transport = ClientStdioTransport::new("my-mcp-server", &["--flag"])?;
    transport.open().await?;
    // Use transport...
    transport.close().await?;
    Ok(())
}

Implementations§

Source§

impl ClientStdioTransport

Source

pub fn new(program: &str, args: &[&str]) -> Result<Self>

Creates a new ClientStdioTransport instance.

§Arguments
  • program - The path or name of the program to execute
  • args - Command-line arguments to pass to the program
§Returns

A Result containing the new transport instance if successful

Trait Implementations§

Source§

impl Clone for ClientStdioTransport

Source§

fn clone(&self) -> ClientStdioTransport

Returns a duplicate of the value. Read more
1.0.0 · Source§

const fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Transport for ClientStdioTransport

Source§

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

Opens the transport by launching the child process and setting up the communication channels.

This method:

  1. Spawns the child process with the configured program and arguments
  2. Sets up pipes for stdin and stdout
  3. Starts a background task for handling incoming messages
§Returns

A Result indicating success or failure

Source§

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

Closes the transport by terminating the child process and cleaning up resources.

This method:

  1. Kills the child process
  2. Clears the stdin and stdout handles
§Returns

A Result indicating success or failure

Source§

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

Polls for incoming messages from the child process’s stdout.

This method reads a line from the child process’s stdout and parses it as a JSON-RPC message.

§Returns

A Result containing an Option<Message>. None indicates EOF.

Source§

fn request( &self, method: &str, params: Option<Value>, options: RequestOptions, ) -> Pin<Box<dyn Future<Output = Result<JsonRpcResponse>> + Send + Sync>>

Sends a request to the child process and waits for a response.

This method:

  1. Creates a new request ID
  2. Constructs a JSON-RPC request
  3. Sends it to the child process’s stdin
  4. Waits for a response with the same ID
§Arguments
  • method - The method name for the request
  • params - Optional parameters for the request
  • options - Request options (like timeout)
§Returns

A Future that resolves to a Result containing the response

Source§

fn send_response<'life0, 'async_trait>( &'life0 self, id: RequestId, result: Option<Value>, error: Option<JsonRpcError>, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Sends a response to a request previously received from the child process.

§Arguments
  • id - The ID of the request being responded to
  • result - Optional successful result
  • error - Optional error information
§Returns

A Result indicating success or failure

Source§

fn send_notification<'life0, 'life1, 'async_trait>( &'life0 self, method: &'life1 str, params: Option<Value>, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Sends a notification to the child process.

Unlike requests, notifications do not expect a response.

§Arguments
  • method - The method name for the notification
  • params - Optional parameters for the notification
§Returns

A Result indicating success or failure

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
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<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

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

Source§

impl<T> MaybeSendSync for T