diff --git a/mcp-core/src/main/java/io/modelcontextprotocol/client/transport/StdioClientTransport.java b/mcp-core/src/main/java/io/modelcontextprotocol/client/transport/StdioClientTransport.java index 1b4eaca97..163a8b46a 100644 --- a/mcp-core/src/main/java/io/modelcontextprotocol/client/transport/StdioClientTransport.java +++ b/mcp-core/src/main/java/io/modelcontextprotocol/client/transport/StdioClientTransport.java @@ -48,16 +48,16 @@ public class StdioClientTransport implements McpClientTransport { /** The server process being communicated with */ private Process process; - private McpJsonMapper jsonMapper; + private final McpJsonMapper jsonMapper; /** Scheduler for handling inbound messages from the server process */ - private Scheduler inboundScheduler; + private final Scheduler inboundScheduler; /** Scheduler for handling outbound messages to the server process */ - private Scheduler outboundScheduler; + private final Scheduler outboundScheduler; /** Scheduler for handling error messages from the server process */ - private Scheduler errorScheduler; + private final Scheduler errorScheduler; /** Parameters for configuring and starting the server process */ private final ServerParameters params; @@ -180,7 +180,7 @@ public void awaitForExit() { private void startErrorProcessing() { this.errorScheduler.schedule(() -> { try (BufferedReader processErrorReader = new BufferedReader( - new InputStreamReader(process.getErrorStream()))) { + new InputStreamReader(process.getErrorStream(), StandardCharsets.UTF_8))) { String line; while (!isClosing && (line = processErrorReader.readLine()) != null) { try { @@ -246,7 +246,8 @@ public Mono sendMessage(JSONRPCMessage message) { */ private void startInboundProcessing() { this.inboundScheduler.schedule(() -> { - try (BufferedReader processReader = new BufferedReader(new InputStreamReader(process.getInputStream()))) { + try (BufferedReader processReader = new BufferedReader( + new InputStreamReader(process.getInputStream(), StandardCharsets.UTF_8))) { String line; while (!isClosing && (line = processReader.readLine()) != null) { try { diff --git a/mcp-core/src/main/java/io/modelcontextprotocol/server/transport/StdioServerTransportProvider.java b/mcp-core/src/main/java/io/modelcontextprotocol/server/transport/StdioServerTransportProvider.java index 68be62931..549bd07b5 100644 --- a/mcp-core/src/main/java/io/modelcontextprotocol/server/transport/StdioServerTransportProvider.java +++ b/mcp-core/src/main/java/io/modelcontextprotocol/server/transport/StdioServerTransportProvider.java @@ -10,7 +10,6 @@ import java.io.InputStreamReader; import java.io.OutputStream; import java.nio.charset.StandardCharsets; -import java.util.List; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Function; @@ -22,7 +21,6 @@ import io.modelcontextprotocol.spec.McpServerSession; import io.modelcontextprotocol.spec.McpServerTransport; import io.modelcontextprotocol.spec.McpServerTransportProvider; -import io.modelcontextprotocol.spec.ProtocolVersions; import io.modelcontextprotocol.util.Assert; import io.modelcontextprotocol.json.McpJsonMapper; import org.slf4j.Logger; @@ -82,11 +80,6 @@ public StdioServerTransportProvider(McpJsonMapper jsonMapper, InputStream inputS this.outputStream = outputStream; } - @Override - public List protocolVersions() { - return List.of(ProtocolVersions.MCP_2024_11_05); - } - @Override public void setSessionFactory(McpServerSession.Factory sessionFactory) { // Create a single session for the stdio connection @@ -124,10 +117,10 @@ private class StdioMcpSessionTransport implements McpServerTransport { private final AtomicBoolean isStarted = new AtomicBoolean(false); /** Scheduler for handling inbound messages */ - private Scheduler inboundScheduler; + private final Scheduler inboundScheduler; /** Scheduler for handling outbound messages */ - private Scheduler outboundScheduler; + private final Scheduler outboundScheduler; private final Sinks.One outboundReady = Sinks.one(); @@ -198,9 +191,9 @@ private void startInboundProcessing() { if (isStarted.compareAndSet(false, true)) { this.inboundScheduler.schedule(() -> { inboundReady.tryEmitValue(null); - BufferedReader reader = null; + BufferedReader reader; try { - reader = new BufferedReader(new InputStreamReader(inputStream)); + reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); while (!isClosing.get()) { try { String line = reader.readLine();