Skip to content

Commit 4e353ac

Browse files
WingTtangyuyi
andauthored
fix: use bufio.Scanner for stdio transport to avoid panic when stdio mcp server outputs a long line (#464)
Change-Id: Iaaaf44f80d2e49f5275c5f6903c87dcb4dbb53a3 Co-authored-by: tangyuyi <[email protected]>
1 parent 35ebaa5 commit 4e353ac

File tree

1 file changed

+7
-6
lines changed

1 file changed

+7
-6
lines changed

client/transport/stdio.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ type Stdio struct {
2727
cmd *exec.Cmd
2828
cmdFunc CommandFunc
2929
stdin io.WriteCloser
30-
stdout *bufio.Reader
30+
stdout *bufio.Scanner
3131
stderr io.ReadCloser
3232
responses map[string]chan *JSONRPCResponse
3333
mu sync.RWMutex
@@ -72,7 +72,7 @@ func WithCommandLogger(logger util.Logger) StdioOption {
7272
func NewIO(input io.Reader, output io.WriteCloser, logging io.ReadCloser) *Stdio {
7373
return &Stdio{
7474
stdin: output,
75-
stdout: bufio.NewReader(input),
75+
stdout: bufio.NewScanner(input),
7676
stderr: logging,
7777

7878
responses: make(map[string]chan *JSONRPCResponse),
@@ -180,7 +180,7 @@ func (c *Stdio) spawnCommand(ctx context.Context) error {
180180
c.cmd = cmd
181181
c.stdin = stdin
182182
c.stderr = stderr
183-
c.stdout = bufio.NewReader(stdout)
183+
c.stdout = bufio.NewScanner(stdout)
184184

185185
if err := cmd.Start(); err != nil {
186186
return fmt.Errorf("failed to start command: %w", err)
@@ -247,14 +247,15 @@ func (c *Stdio) readResponses() {
247247
case <-c.done:
248248
return
249249
default:
250-
line, err := c.stdout.ReadString('\n')
251-
if err != nil {
252-
if err != io.EOF && !errors.Is(err, context.Canceled) {
250+
if !c.stdout.Scan() {
251+
err := c.stdout.Err()
252+
if err != nil && !errors.Is(err, context.Canceled) {
253253
c.logger.Errorf("Error reading from stdout: %v", err)
254254
}
255255
return
256256
}
257257

258+
line := c.stdout.Text()
258259
// First try to parse as a generic message to check for ID field
259260
var baseMessage struct {
260261
JSONRPC string `json:"jsonrpc"`

0 commit comments

Comments
 (0)