@@ -12,15 +12,6 @@ import (
12
12
"github.com/mark3labs/mcp-go/mcp"
13
13
)
14
14
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
-
24
15
// sseSession represents an active SSE connection.
25
16
type sseSession struct {
26
17
writer http.ResponseWriter
@@ -29,19 +20,67 @@ type sseSession struct {
29
20
eventQueue chan string // Channel for queuing events
30
21
}
31
22
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
37
48
}
38
49
}
39
50
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
+
40
81
// NewTestServer creates a test server for testing purposes
41
82
func NewTestServer (server * MCPServer ) * httptest.Server {
42
- sseServer := & SSEServer {
43
- server : server ,
44
- }
83
+ sseServer := NewSSEServer (server )
45
84
46
85
testServer := httptest .NewServer (sseServer )
47
86
sseServer .baseURL = testServer .URL
@@ -132,8 +171,9 @@ func (s *SSEServer) handleSSE(w http.ResponseWriter, r *http.Request) {
132
171
}()
133
172
134
173
messageEndpoint := fmt .Sprintf (
135
- "%s/message ?sessionId=%s" ,
174
+ "%s%s ?sessionId=%s" ,
136
175
s .baseURL ,
176
+ s .messageEndpoint ,
137
177
sessionID ,
138
178
)
139
179
@@ -260,9 +300,9 @@ func (s *SSEServer) SendEventToSession(
260
300
// ServeHTTP implements the http.Handler interface.
261
301
func (s * SSEServer ) ServeHTTP (w http.ResponseWriter , r * http.Request ) {
262
302
switch r .URL .Path {
263
- case "/sse" :
303
+ case s . sseEndpoint :
264
304
s .handleSSE (w , r )
265
- case "/message" :
305
+ case s . messageEndpoint :
266
306
s .handleMessage (w , r )
267
307
default :
268
308
http .NotFound (w , r )
0 commit comments