From 463b2843ab1dca5b79b72add3bf3586823fb56de Mon Sep 17 00:00:00 2001 From: iamsurajbobade Date: Fri, 19 Sep 2025 21:57:31 +0530 Subject: [PATCH 1/2] feat: Add support for SSEOptions to SSEHandler --- examples/server/sse/main.go | 2 +- mcp/sse.go | 18 ++++++++++++++---- mcp/sse_example_test.go | 2 +- mcp/sse_test.go | 4 +++- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/examples/server/sse/main.go b/examples/server/sse/main.go index 27f9caed..044a0374 100644 --- a/examples/server/sse/main.go +++ b/examples/server/sse/main.go @@ -65,6 +65,6 @@ func main() { default: return nil } - }) + }, &mcp.SSEOptions{}) log.Fatal(http.ListenAndServe(addr, handler)) } diff --git a/mcp/sse.go b/mcp/sse.go index f39a0397..7f644918 100644 --- a/mcp/sse.go +++ b/mcp/sse.go @@ -43,12 +43,18 @@ import ( // [2024-11-05 version]: https://modelcontextprotocol.io/specification/2024-11-05/basic/transports type SSEHandler struct { getServer func(request *http.Request) *Server + opts SSEOptions onConnection func(*ServerSession) // for testing; must not block mu sync.Mutex sessions map[string]*SSEServerTransport } +// SSEOptions specifies options for an [SSEHandler]. +// for now, it is empty, but may be extended in future. +// https://github.com/modelcontextprotocol/go-sdk/issues/507 +type SSEOptions struct{} + // NewSSEHandler returns a new [SSEHandler] that creates and manages MCP // sessions created via incoming HTTP requests. // @@ -62,13 +68,17 @@ type SSEHandler struct { // The getServer function may return a distinct [Server] for each new // request, or reuse an existing server. If it returns nil, the handler // will return a 400 Bad Request. -// -// TODO(rfindley): add options. -func NewSSEHandler(getServer func(request *http.Request) *Server) *SSEHandler { - return &SSEHandler{ +func NewSSEHandler(getServer func(request *http.Request) *Server, opts *SSEOptions) *SSEHandler { + s := &SSEHandler{ getServer: getServer, sessions: make(map[string]*SSEServerTransport), } + + if opts != nil { + s.opts = *opts + } + + return s } // A SSEServerTransport is a logical SSE session created through a hanging GET diff --git a/mcp/sse_example_test.go b/mcp/sse_example_test.go index d06ea62b..6132d31e 100644 --- a/mcp/sse_example_test.go +++ b/mcp/sse_example_test.go @@ -31,7 +31,7 @@ func ExampleSSEHandler() { server := mcp.NewServer(&mcp.Implementation{Name: "adder", Version: "v0.0.1"}, nil) mcp.AddTool(server, &mcp.Tool{Name: "add", Description: "add two numbers"}, Add) - handler := mcp.NewSSEHandler(func(*http.Request) *mcp.Server { return server }) + handler := mcp.NewSSEHandler(func(*http.Request) *mcp.Server { return server }, nil) httpServer := httptest.NewServer(handler) defer httpServer.Close() diff --git a/mcp/sse_test.go b/mcp/sse_test.go index 32a20bf3..f3c771b8 100644 --- a/mcp/sse_test.go +++ b/mcp/sse_test.go @@ -24,7 +24,9 @@ func TestSSEServer(t *testing.T) { server := NewServer(testImpl, nil) AddTool(server, &Tool{Name: "greet"}, sayHi) - sseHandler := NewSSEHandler(func(*http.Request) *Server { return server }) + sseOptions := &SSEOptions{} + + sseHandler := NewSSEHandler(func(*http.Request) *Server { return server }, sseOptions) serverSessions := make(chan *ServerSession, 1) sseHandler.onConnection = func(ss *ServerSession) { From 1311c4f8cf0baea4b8d3f2d12dd3a74341665ac5 Mon Sep 17 00:00:00 2001 From: iamsurajbobade Date: Fri, 19 Sep 2025 22:21:39 +0530 Subject: [PATCH 2/2] address review comments --- examples/server/sse/main.go | 2 +- mcp/sse_test.go | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/examples/server/sse/main.go b/examples/server/sse/main.go index 044a0374..0507dd60 100644 --- a/examples/server/sse/main.go +++ b/examples/server/sse/main.go @@ -65,6 +65,6 @@ func main() { default: return nil } - }, &mcp.SSEOptions{}) + }, nil) log.Fatal(http.ListenAndServe(addr, handler)) } diff --git a/mcp/sse_test.go b/mcp/sse_test.go index f3c771b8..25435ff3 100644 --- a/mcp/sse_test.go +++ b/mcp/sse_test.go @@ -24,9 +24,7 @@ func TestSSEServer(t *testing.T) { server := NewServer(testImpl, nil) AddTool(server, &Tool{Name: "greet"}, sayHi) - sseOptions := &SSEOptions{} - - sseHandler := NewSSEHandler(func(*http.Request) *Server { return server }, sseOptions) + sseHandler := NewSSEHandler(func(*http.Request) *Server { return server }, nil) serverSessions := make(chan *ServerSession, 1) sseHandler.onConnection = func(ss *ServerSession) {