1212namespace Mcp \Server \Transport ;
1313
1414use Mcp \Schema \JsonRpc \Error ;
15+ use Mcp \Server \Transport \Stdio \RunnerControl ;
16+ use Mcp \Server \Transport \Stdio \RunnerControlInterface ;
17+ use Mcp \Server \Transport \Stdio \RunnerState ;
1518use Psr \Log \LoggerInterface ;
1619
1720/**
2124 */
2225class StdioTransport extends BaseTransport
2326{
27+ private RunnerControlInterface $ runnerControl ;
28+
2429 /**
2530 * @param resource $input
2631 * @param resource $output
@@ -29,7 +34,9 @@ public function __construct(
2934 private $ input = \STDIN ,
3035 private $ output = \STDOUT ,
3136 ?LoggerInterface $ logger = null ,
37+ ?RunnerControlInterface $ runnerControl = null ,
3238 ) {
39+ $ this ->runnerControl = $ runnerControl ?? new RunnerControl ();
3340 parent ::__construct ($ logger );
3441 }
3542
@@ -47,14 +54,17 @@ public function listen(): int
4754 $ this ->logger ->info ('StdioTransport is listening for messages on STDIN... ' );
4855 stream_set_blocking ($ this ->input , false );
4956
50- while (!feof ($ this ->input )) {
57+ while (!feof ($ this ->input ) && RunnerState:: RUNNING === $ this -> runnerControl -> getState () ) {
5158 $ this ->processInput ();
5259 $ this ->processFiber ();
5360 $ this ->flushOutgoingMessages ();
5461 }
5562
5663 $ this ->logger ->info ('StdioTransport finished listening. ' );
57- $ this ->handleSessionEnd ($ this ->sessionId );
64+ if (\in_array ($ this ->runnerControl ->getState (), [RunnerState::RUNNING , RunnerState::STOP_AND_END_SESSION ], true )) {
65+ $ this ->logger ->info ('StdioTransport end session. ' );
66+ $ this ->handleSessionEnd ($ this ->sessionId );
67+ }
5868
5969 return 0 ;
6070 }
0 commit comments