diff --git a/mcp/event.go b/mcp/event.go index 80b42f5..41ff4ae 100644 --- a/mcp/event.go +++ b/mcp/event.go @@ -41,7 +41,7 @@ func (e Event) Empty() bool { } // writeEvent writes the event to w, and flushes. -func writeEvent(w io.Writer, evt Event) (int, error) { +func writeEvent(w http.ResponseWriter, evt Event) (int, error) { var b bytes.Buffer if evt.Name != "" { fmt.Fprintf(&b, "event: %s\n", evt.Name) @@ -54,9 +54,9 @@ func writeEvent(w io.Writer, evt Event) (int, error) { } fmt.Fprintf(&b, "data: %s\n\n", string(evt.Data)) n, err := w.Write(b.Bytes()) - if f, ok := w.(http.Flusher); ok { - f.Flush() - } + rc := http.NewResponseController(w) + // Ignore returned error as flushing is best-effort. + _ = rc.Flush() return n, err } diff --git a/mcp/streamable.go b/mcp/streamable.go index 0482c79..b0b1795 100644 --- a/mcp/streamable.go +++ b/mcp/streamable.go @@ -1053,9 +1053,9 @@ func (c *streamableServerConn) acquireStream(ctx context.Context, w http.Respons // Issue #410: the standalone SSE stream is likely not to receive messages // for a long time. Ensure that headers are flushed. w.WriteHeader(http.StatusOK) - if f, ok := w.(http.Flusher); ok { - f.Flush() - } + rc := http.NewResponseController(w) + // Ignore returned error as flushing is best-effort. + _ = rc.Flush() } for _, data := range toReplay { diff --git a/mcp/streamable_client_test.go b/mcp/streamable_client_test.go index 57407d4..43564fd 100644 --- a/mcp/streamable_client_test.go +++ b/mcp/streamable_client_test.go @@ -119,14 +119,15 @@ func (s *fakeStreamableServer) ServeHTTP(w http.ResponseWriter, req *http.Reques for k, v := range resp.header { w.Header().Set(k, v) } + rc := http.NewResponseController(w) w.WriteHeader(status) - w.(http.Flusher).Flush() // flush response headers + rc.Flush() // flush response headers if v := req.Header.Get(protocolVersionHeader); v != resp.wantProtocolVersion && resp.wantProtocolVersion != "" { s.t.Errorf("%v: bad protocol version header: got %q, want %q", key, v, resp.wantProtocolVersion) } w.Write([]byte(body)) - w.(http.Flusher).Flush() // flush response + rc.Flush() // flush response if resp.done != nil { <-resp.done