Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Diagnostics;
using System.Text;
using System.Text.Json;
using ModelContextProtocol.Configuration;
using ModelContextProtocol.Logging;
Expand Down Expand Up @@ -59,7 +60,7 @@ public async Task ConnectAsync(CancellationToken cancellationToken = default)

_shutdownCts = new CancellationTokenSource();

var startInfo = new ProcessStartInfo
ProcessStartInfo startInfo = new()
{
FileName = _options.Command,
RedirectStandardInput = true,
Expand All @@ -68,6 +69,8 @@ public async Task ConnectAsync(CancellationToken cancellationToken = default)
UseShellExecute = false,
CreateNoWindow = true,
WorkingDirectory = _options.WorkingDirectory ?? Environment.CurrentDirectory,
StandardOutputEncoding = Encoding.UTF8,
StandardErrorEncoding = Encoding.UTF8,
};

if (!string.IsNullOrWhiteSpace(_options.Arguments))
Expand All @@ -92,11 +95,39 @@ public async Task ConnectAsync(CancellationToken cancellationToken = default)
// Set up error logging
_process.ErrorDataReceived += (sender, args) => _logger.TransportError(EndpointName, args.Data ?? "(no data)");

if (!_process.Start())
bool processStarted;
#if NET
startInfo.StandardInputEncoding = Encoding.UTF8;
processStarted = _process.Start();
#else
// netstandard2.0 lacks ProcessStartInfo.StandardInputEncoding. Instead, it always
// uses Console.InputEncoding, so we need to temporarily change Console.InputEncoding
// if it's not already UTF-8.
Encoding oldStdinEncoding = Console.InputEncoding;
if (oldStdinEncoding.CodePage == Encoding.UTF8.CodePage)
{
processStarted = _process.Start();
}
else
{
try
{
Console.InputEncoding = Encoding.UTF8;
processStarted = _process.Start();
}
finally
{
Console.InputEncoding = oldStdinEncoding;
}
}
#endif

if (!processStarted)
{
_logger.TransportProcessStartFailed(EndpointName);
throw new McpTransportException("Failed to start MCP server process");
}

_logger.TransportProcessStarted(EndpointName, _process.Id);
_processStarted = true;
_process.BeginErrorReadLine();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Options;
using System.Text;

namespace ModelContextProtocol.Protocol.Transport;

Expand Down Expand Up @@ -80,7 +81,17 @@ public StdioServerTransport(string serverName, ILoggerFactory? loggerFactory = n
: base(loggerFactory)
{
Throw.IfNull(serverName);


if (Console.InputEncoding.CodePage != Encoding.UTF8.CodePage)
{
Console.InputEncoding = Encoding.UTF8;
}

if (Console.OutputEncoding.CodePage != Encoding.UTF8.CodePage)
{
Console.OutputEncoding = Encoding.UTF8;
}

_serverName = serverName;
_logger = (ILogger?)loggerFactory?.CreateLogger<StdioClientTransport>() ?? NullLogger.Instance;
}
Expand Down
Loading