fix: handle Windows CRLF in MCP client(#664) (#665)

This change updates the MCP client stdio JSON decoder to correctly
handle
both Unix (`\n`) and Windows (`\r\n`) line endings. 

Fixes #664

Co-authored-by: qysz <i_zf@qq.com>
This commit is contained in:
isfzhang 2025-12-02 01:16:39 +08:00 • committed by GitHub
commit 1bec3c60a0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 7 additions and 1 deletions

View file

@ -380,7 +380,8 @@ func newIOConn(rwc io.ReadWriteCloser) *ioConn {
var tr [1]byte
if n, readErr := dec.Buffered().Read(tr[:]); n > 0 {
// If read byte is not a newline, it is an error.
if tr[0] != '\n' {
// Support both Unix (\n) and Windows (\r\n) line endings.
if tr[0] != '\n' && tr[0] != '\r' {
err = fmt.Errorf("invalid trailing data at the end of stream")
}
} else if readErr != nil && readErr != io.EOF {

View file

@ -83,6 +83,11 @@ func TestIOConnRead(t *testing.T) {
want: "",
protocolVersion: "",
},
{
name: "windows newline at the end of first valid json input",
input: "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"test\",\"params\":{}}\r\n",
want: "",
},
{
name: "batching old protocol",
input: `[{"jsonrpc":"2.0","id":1,"method":"test1"},{"jsonrpc":"2.0","id":2,"method":"test2"}]`,