Skip to content

Commit 57cd656

Browse files
committed
refactor(server): update NewServer function to use functional options for optional configurations, enhancing flexibility for trace capture and forward proxy settings
1 parent cff0651 commit 57cd656

2 files changed

Lines changed: 43 additions & 10 deletions

File tree

cmd/mcp-gateway/main.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,15 @@ func run() {
182182
}
183183

184184
// Create server instance
185-
server, err := core.NewServer(logger, cfg.Port, store, sessionStore, a, cfg.Forward, cfg.Tracing.Capture)
185+
server, err := core.NewServer(
186+
logger,
187+
cfg.Port,
188+
store,
189+
sessionStore,
190+
a,
191+
core.WithForwardConfig(cfg.Forward),
192+
core.WithTraceCapture(cfg.Tracing.Capture),
193+
)
186194
if err != nil {
187195
logger.Fatal("Failed to create server", zap.Error(err))
188196
}

internal/core/server.go

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,22 @@ type (
7272
}
7373
)
7474

75-
// NewServer creates a new MCP server
76-
func NewServer(logger *zap.Logger, port int, store storage.Store, sessionStore session.Store, a auth.Auth, forwardConfig config.ForwardConfig, traceCapture apptrace.CaptureConfig) (*Server, error) {
75+
// ServerOption allows configuring optional server features without breaking callers.
76+
type ServerOption func(*Server)
77+
78+
// WithTraceCapture sets the trace capture configuration.
79+
func WithTraceCapture(c apptrace.CaptureConfig) ServerOption {
80+
return func(s *Server) { s.traceCapture = c }
81+
}
82+
83+
// WithForwardConfig sets the forward proxy configuration.
84+
func WithForwardConfig(cfg config.ForwardConfig) ServerOption {
85+
return func(s *Server) { s.applyForwardConfig(cfg) }
86+
}
87+
88+
// NewServer creates a new MCP server. Required params are explicit; optional
89+
// features are configured via ServerOption (e.g., tracing, forward config).
90+
func NewServer(logger *zap.Logger, port int, store storage.Store, sessionStore session.Store, a auth.Auth, opts ...ServerOption) (*Server, error) {
7791
s := &Server{
7892
logger: logger,
7993
port: port,
@@ -84,15 +98,13 @@ func NewServer(logger *zap.Logger, port int, store storage.Store, sessionStore s
8498
shutdownCh: make(chan struct{}),
8599
toolRespHandler: CreateResponseHandlerChain(),
86100
auth: a,
87-
forwardConfig: forwardConfig,
88-
traceCapture: traceCapture,
89-
caseInsensitive: forwardConfig.Header.CaseInsensitive,
90101
}
91102

92-
// Pre-parse header lists for efficient runtime lookup (only if forward is enabled)
93-
if forwardConfig.Enabled {
94-
s.ignoreHeaders = parseHeaderList(forwardConfig.Header.IgnoreHeaders, forwardConfig.Header.CaseInsensitive)
95-
s.allowHeaders = parseHeaderList(forwardConfig.Header.AllowHeaders, forwardConfig.Header.CaseInsensitive)
103+
// Apply options
104+
for _, opt := range opts {
105+
if opt != nil {
106+
opt(s)
107+
}
96108
}
97109

98110
// Load HTML templates
@@ -105,6 +117,19 @@ func NewServer(logger *zap.Logger, port int, store storage.Store, sessionStore s
105117
return s, nil
106118
}
107119

120+
// applyForwardConfig sets forward config and recomputes derived fields.
121+
func (s *Server) applyForwardConfig(cfg config.ForwardConfig) {
122+
s.forwardConfig = cfg
123+
s.caseInsensitive = cfg.Header.CaseInsensitive
124+
if cfg.Enabled {
125+
s.ignoreHeaders = parseHeaderList(cfg.Header.IgnoreHeaders, cfg.Header.CaseInsensitive)
126+
s.allowHeaders = parseHeaderList(cfg.Header.AllowHeaders, cfg.Header.CaseInsensitive)
127+
} else {
128+
s.ignoreHeaders = nil
129+
s.allowHeaders = nil
130+
}
131+
}
132+
108133
// RegisterRoutes registers routes with the given router for MCP servers
109134
func (s *Server) RegisterRoutes(ctx context.Context) error {
110135
s.router.GET("/health_check", func(c *gin.Context) {

0 commit comments

Comments
 (0)