@@ -12,15 +12,6 @@ import (
1212 "github.com/mark3labs/mcp-go/mcp"
1313)
1414
15- // SSEServer implements a Server-Sent Events (SSE) based MCP server.
16- // It provides real-time communication capabilities over HTTP using the SSE protocol.
17- type SSEServer struct {
18- server * MCPServer
19- baseURL string
20- sessions sync.Map
21- srv * http.Server
22- }
23-
2415// sseSession represents an active SSE connection.
2516type sseSession struct {
2617 writer http.ResponseWriter
@@ -29,19 +20,67 @@ type sseSession struct {
2920 eventQueue chan string // Channel for queuing events
3021}
3122
32- // NewSSEServer creates a new SSE server instance with the given MCP server and base URL.
33- func NewSSEServer (server * MCPServer , baseURL string ) * SSEServer {
34- return & SSEServer {
35- server : server ,
36- baseURL : baseURL ,
23+ // SSEServer implements a Server-Sent Events (SSE) based MCP server.
24+ // It provides real-time communication capabilities over HTTP using the SSE protocol.
25+ type SSEServer struct {
26+ server * MCPServer
27+ baseURL string
28+ messageEndpoint string
29+ sseEndpoint string
30+ sessions sync.Map
31+ srv * http.Server
32+ }
33+
34+ // Option defines a function type for configuring SSEServer
35+ type Option func (* SSEServer )
36+
37+ // WithBaseURL sets the base URL for the SSE server
38+ func WithBaseURL (baseURL string ) Option {
39+ return func (s * SSEServer ) {
40+ s .baseURL = baseURL
41+ }
42+ }
43+
44+ // WithMessageEndpoint sets the message endpoint path
45+ func WithMessageEndpoint (endpoint string ) Option {
46+ return func (s * SSEServer ) {
47+ s .messageEndpoint = endpoint
3748 }
3849}
3950
51+ // WithSSEEndpoint sets the SSE endpoint path
52+ func WithSSEEndpoint (endpoint string ) Option {
53+ return func (s * SSEServer ) {
54+ s .sseEndpoint = endpoint
55+ }
56+ }
57+
58+ // WithHTTPServer sets the HTTP server instance
59+ func WithHTTPServer (srv * http.Server ) Option {
60+ return func (s * SSEServer ) {
61+ s .srv = srv
62+ }
63+ }
64+
65+ // NewSSEServer creates a new SSE server instance with the given MCP server and options.
66+ func NewSSEServer (server * MCPServer , opts ... Option ) * SSEServer {
67+ s := & SSEServer {
68+ server : server ,
69+ sseEndpoint : "/sse" ,
70+ messageEndpoint : "/message" ,
71+ }
72+
73+ // Apply all options
74+ for _ , opt := range opts {
75+ opt (s )
76+ }
77+
78+ return s
79+ }
80+
4081// NewTestServer creates a test server for testing purposes
4182func NewTestServer (server * MCPServer ) * httptest.Server {
42- sseServer := & SSEServer {
43- server : server ,
44- }
83+ sseServer := NewSSEServer (server )
4584
4685 testServer := httptest .NewServer (sseServer )
4786 sseServer .baseURL = testServer .URL
@@ -132,8 +171,9 @@ func (s *SSEServer) handleSSE(w http.ResponseWriter, r *http.Request) {
132171 }()
133172
134173 messageEndpoint := fmt .Sprintf (
135- "%s/message ?sessionId=%s" ,
174+ "%s%s ?sessionId=%s" ,
136175 s .baseURL ,
176+ s .messageEndpoint ,
137177 sessionID ,
138178 )
139179
@@ -260,9 +300,9 @@ func (s *SSEServer) SendEventToSession(
260300// ServeHTTP implements the http.Handler interface.
261301func (s * SSEServer ) ServeHTTP (w http.ResponseWriter , r * http.Request ) {
262302 switch r .URL .Path {
263- case "/sse" :
303+ case s . sseEndpoint :
264304 s .handleSSE (w , r )
265- case "/message" :
305+ case s . messageEndpoint :
266306 s .handleMessage (w , r )
267307 default :
268308 http .NotFound (w , r )
0 commit comments