diff --git a/mcp/transport.go b/mcp/transport.go index cacd65fd..535de719 100644 --- a/mcp/transport.go +++ b/mcp/transport.go @@ -381,7 +381,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 { diff --git a/mcp/transport_test.go b/mcp/transport_test.go index aeff3663..515b8c19 100644 --- a/mcp/transport_test.go +++ b/mcp/transport_test.go @@ -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"}]`,