From adebac9f894ba71e057a91223493cb62933b2146 Mon Sep 17 00:00:00 2001 From: Konstantin Alikhanov Date: Thu, 28 Aug 2025 21:28:16 +0400 Subject: [PATCH 1/4] mcp: add IOTransport for separate reader/writer Enable MCP communication over arbitrary I/O streams beyond stdin/stdout, supporting custom transport implementations. --- mcp/transport.go | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/mcp/transport.go b/mcp/transport.go index fac640a6..7eaea508 100644 --- a/mcp/transport.go +++ b/mcp/transport.go @@ -103,6 +103,29 @@ func NewStdioTransport() *StdioTransport { return &StdioTransport{} } +// A StdioTransport is a [Transport] that communicates over stdin/stdout using +// newline-delimited JSON. +type IOTransport struct { + reader io.ReadCloser + writer io.WriteCloser +} + +// Connect implements the [Transport] interface. +func (t *IOTransport) Connect(context.Context) (Connection, error) { + return newIOConn(rwc{t.reader, t.writer}), nil +} + +// NewIOTransport constructs a transport that communicates over +// io.ReadCloser and io.WriteCloser. +// +//go:fix inline +func NewIOTransport(reader io.ReadCloser, writer io.WriteCloser) *IOTransport { + return &IOTransport{ + reader: reader, + writer: writer, + } +} + // An InMemoryTransport is a [Transport] that communicates over an in-memory // network connection, using newline-delimited JSON. type InMemoryTransport struct { From 02194a658650ee510e7aaa4284489001b6160728 Mon Sep 17 00:00:00 2001 From: Konstantin Alikhanov Date: Thu, 28 Aug 2025 21:32:26 +0400 Subject: [PATCH 2/4] refactor: update IOTransport documentation for clarity on reader/writer usage --- mcp/transport.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mcp/transport.go b/mcp/transport.go index 7eaea508..10fe90e9 100644 --- a/mcp/transport.go +++ b/mcp/transport.go @@ -103,8 +103,8 @@ func NewStdioTransport() *StdioTransport { return &StdioTransport{} } -// A StdioTransport is a [Transport] that communicates over stdin/stdout using -// newline-delimited JSON. +// An IOTransport is a [Transport] that communicates over separate +// io.ReadCloser and io.WriteCloser using newline-delimited JSON. type IOTransport struct { reader io.ReadCloser writer io.WriteCloser From 2d54a39cc02ecdcbc4bd5fc1049a0024d776a492 Mon Sep 17 00:00:00 2001 From: Konstantin Alikhanov Date: Wed, 10 Sep 2025 13:11:54 +0400 Subject: [PATCH 3/4] refactor: update IOTransport fields to public --- mcp/transport.go | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/mcp/transport.go b/mcp/transport.go index 10fe90e9..fff0bfd6 100644 --- a/mcp/transport.go +++ b/mcp/transport.go @@ -106,24 +106,13 @@ func NewStdioTransport() *StdioTransport { // An IOTransport is a [Transport] that communicates over separate // io.ReadCloser and io.WriteCloser using newline-delimited JSON. type IOTransport struct { - reader io.ReadCloser - writer io.WriteCloser + Reader io.ReadCloser + Writer io.WriteCloser } // Connect implements the [Transport] interface. func (t *IOTransport) Connect(context.Context) (Connection, error) { - return newIOConn(rwc{t.reader, t.writer}), nil -} - -// NewIOTransport constructs a transport that communicates over -// io.ReadCloser and io.WriteCloser. -// -//go:fix inline -func NewIOTransport(reader io.ReadCloser, writer io.WriteCloser) *IOTransport { - return &IOTransport{ - reader: reader, - writer: writer, - } + return newIOConn(rwc{t.Reader, t.Writer}), nil } // An InMemoryTransport is a [Transport] that communicates over an in-memory From 4082fdf293b63f2eea979e596b113100b59fb806 Mon Sep 17 00:00:00 2001 From: Konstantin Alikhanov Date: Fri, 19 Sep 2025 02:59:55 +0400 Subject: [PATCH 4/4] removing NewStdioTransport constructor --- mcp/transport.go | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/mcp/transport.go b/mcp/transport.go index 2838d74b..56959632 100644 --- a/mcp/transport.go +++ b/mcp/transport.go @@ -93,18 +93,6 @@ func (*StdioTransport) Connect(context.Context) (Connection, error) { return newIOConn(rwc{os.Stdin, os.Stdout}), nil } - -// NewStdioTransport constructs a transport that communicates over -// stdin/stdout. -// -// Deprecated: use a StdioTransport literal. -// -//go:fix inline -func NewStdioTransport() *StdioTransport { - return &StdioTransport{} -} - - // An IOTransport is a [Transport] that communicates over separate // io.ReadCloser and io.WriteCloser using newline-delimited JSON. type IOTransport struct { @@ -117,7 +105,6 @@ func (t *IOTransport) Connect(context.Context) (Connection, error) { return newIOConn(rwc{t.Reader, t.Writer}), nil } - // An InMemoryTransport is a [Transport] that communicates over an in-memory // network connection, using newline-delimited JSON. type InMemoryTransport struct {