using Microsoft.Extensions.Logging;
using ModelContextProtocol.Utils;
namespace ModelContextProtocol.Protocol.Transport;
///
/// Provides a client MCP transport implemented around a pair of input/output streams.
///
public sealed class StreamClientTransport : IClientTransport
{
private readonly Stream _serverInput;
private readonly Stream _serverOutput;
private readonly ILoggerFactory? _loggerFactory;
///
/// Initializes a new instance of the class.
///
///
/// The stream representing the connected server's input.
/// Writes to this stream will be sent to the server.
///
///
/// The stream representing the connected server's output.
/// Reads from this stream will receive messages from the server.
///
/// A logger factory for creating loggers.
public StreamClientTransport(
Stream serverInput, Stream serverOutput, ILoggerFactory? loggerFactory = null)
{
Throw.IfNull(serverInput);
Throw.IfNull(serverOutput);
_serverInput = serverInput;
_serverOutput = serverOutput;
_loggerFactory = loggerFactory;
}
///
public string Name => $"in-memory-stream";
///
public Task ConnectAsync(CancellationToken cancellationToken = default)
{
return Task.FromResult(new StreamClientSessionTransport(
new StreamWriter(_serverInput),
new StreamReader(_serverOutput),
"Client (stream)",
_loggerFactory));
}
}