1717package org .springframework .ai .mcp .client .stdio ;
1818
1919import java .io .BufferedReader ;
20- import java .io .BufferedWriter ;
2120import java .io .IOException ;
21+ import java .io .InputStreamReader ;
2222import java .util .ArrayList ;
2323import java .util .HashMap ;
2424import java .util .List ;
@@ -51,12 +51,6 @@ public class StdioServerTransport extends AbstractMcpTransport {
5151
5252 private Process process ;
5353
54- private BufferedReader processErrorReader ;
55-
56- private BufferedReader processReader ;
57-
58- private BufferedWriter processWriter ;
59-
6054 private Scheduler inboundScheduler ;
6155
6256 private Scheduler outboundScheduler ;
@@ -116,11 +110,6 @@ public void start() {
116110 throw new RuntimeException ("Process input or output stream is null" );
117111 }
118112
119- // Initialize readers and writers
120- this .processErrorReader = this .process .errorReader ();
121- this .processReader = this .process .inputReader ();
122- this .processWriter = this .process .outputWriter ();
123-
124113 // Start threads
125114 this .isRunning = true ;
126115 startInboundProcessing ();
@@ -143,7 +132,8 @@ public void awaitForExit() {
143132
144133 private void startErrorProcessing () {
145134 this .errorScheduler .schedule (() -> {
146- try {
135+ try (BufferedReader processErrorReader = new BufferedReader (
136+ new InputStreamReader (process .getErrorStream ()))) {
147137 String line ;
148138 while (isRunning && processErrorReader != null && (line = processErrorReader .readLine ()) != null ) {
149139 try {
@@ -169,9 +159,9 @@ private void startErrorProcessing() {
169159
170160 private void startInboundProcessing () {
171161 this .inboundScheduler .schedule (() -> {
172- try {
162+ try ( BufferedReader processReader = new BufferedReader ( new InputStreamReader ( process . getInputStream ()))) {
173163 String line ;
174- while (this .isRunning && this . processReader != null && (line = this . processReader .readLine ()) != null ) {
164+ while (this .isRunning && processReader != null && (line = processReader .readLine ()) != null ) {
175165 try {
176166 JSONRPCMessage message = deserializeJsonRpcMessage (line );
177167 if (!this .getInboundSink ().tryEmitNext (message ).isSuccess ()) {
@@ -222,9 +212,9 @@ private void startOutboundProcessing() {
222212 .handle ((message , s ) -> {
223213 if (message != null ) {
224214 try {
225- this .processWriter .write (objectMapper .writeValueAsString (message ));
226- this .processWriter .newLine ();
227- this .processWriter .flush ();
215+ this .process . outputWriter () .write (objectMapper .writeValueAsString (message ));
216+ this .process . outputWriter () .newLine ();
217+ this .process . outputWriter () .flush ();
228218 s .next (message );
229219 }
230220 catch (IOException e ) {
0 commit comments