88 "net/http"
99 "os"
1010 "os/signal"
11- "slices"
1211 "strings"
1312 "syscall"
1413 "time"
@@ -115,18 +114,8 @@ func NewStdioMCPServer(ctx context.Context, cfg github.MCPServerConfig) (*mcp.Se
115114 return nil , fmt .Errorf ("failed to create GitHub clients: %w" , err )
116115 }
117116
118- // Create feature checker — insiders mode expands InsidersFeatureFlags
119- enabledFeatures := cfg .EnabledFeatures
120- if cfg .InsidersMode {
121- enabledFeatures = slices .Clone (enabledFeatures )
122- for _ , flag := range github .InsidersFeatureFlags {
123- if ! slices .Contains (enabledFeatures , flag ) {
124- enabledFeatures = append (enabledFeatures , flag )
125- }
126- }
127- }
128- featureChecker := createFeatureChecker (enabledFeatures )
129- mcpAppsEnabled := slices .Contains (enabledFeatures , github .MCPAppsFeatureFlag )
117+ // Create feature checker — resolves explicit features + insiders expansion
118+ featureChecker := createFeatureChecker (cfg .EnabledFeatures , cfg .InsidersMode )
130119
131120 // Create dependencies for tool handlers
132121 obs , err := observability .NewExporters (cfg .Logger , metrics .NewNoopMetrics ())
@@ -155,8 +144,7 @@ func NewStdioMCPServer(ctx context.Context, cfg github.MCPServerConfig) (*mcp.Se
155144 WithTools (github .CleanTools (cfg .EnabledTools )).
156145 WithExcludeTools (cfg .ExcludeTools ).
157146 WithServerInstructions ().
158- WithFeatureChecker (featureChecker ).
159- WithMCPApps (mcpAppsEnabled )
147+ WithFeatureChecker (featureChecker )
160148
161149 // Apply token scope filtering if scopes are known (for PAT filtering)
162150 if cfg .TokenScopes != nil {
@@ -177,6 +165,7 @@ func NewStdioMCPServer(ctx context.Context, cfg github.MCPServerConfig) (*mcp.Se
177165 // and UI assets are available (requires running script/build-ui).
178166 // We check availability to allow the feature flag to be enabled without
179167 // requiring a UI build (graceful degradation).
168+ mcpAppsEnabled , _ := featureChecker (context .Background (), github .MCPAppsFeatureFlag )
180169 if mcpAppsEnabled && github .UIAssetsAvailable () {
181170 github .RegisterUIResources (ghServer )
182171 }
@@ -346,15 +335,11 @@ func RunStdioServer(cfg StdioServerConfig) error {
346335 return nil
347336}
348337
349- // createFeatureChecker returns a FeatureFlagChecker that checks if a flag name
350- // is present in the provided list of enabled features. For the local server,
351- // this is populated from the --features CLI flag.
352- func createFeatureChecker (enabledFeatures []string ) inventory.FeatureFlagChecker {
353- // Build a set for O(1) lookup
354- featureSet := make (map [string ]bool , len (enabledFeatures ))
355- for _ , f := range enabledFeatures {
356- featureSet [f ] = true
357- }
338+ // createFeatureChecker returns a FeatureFlagChecker that resolves features
339+ // using the centralized ResolveFeatureFlags function. For the local server,
340+ // features are resolved once at startup from --features CLI flag + insiders mode.
341+ func createFeatureChecker (enabledFeatures []string , insidersMode bool ) inventory.FeatureFlagChecker {
342+ featureSet := github .ResolveFeatureFlags (enabledFeatures , insidersMode )
358343 return func (_ context.Context , flagName string ) (bool , error ) {
359344 return featureSet [flagName ], nil
360345 }
0 commit comments