@@ -8,16 +8,26 @@ import (
88 "net/http"
99 "os"
1010 "os/signal"
11+ "slices"
1112 "syscall"
1213 "time"
1314
15+ ghcontext "github.com/github/github-mcp-server/pkg/context"
1416 "github.com/github/github-mcp-server/pkg/github"
17+ "github.com/github/github-mcp-server/pkg/inventory"
1518 "github.com/github/github-mcp-server/pkg/lockdown"
1619 "github.com/github/github-mcp-server/pkg/translations"
1720 "github.com/github/github-mcp-server/pkg/utils"
1821 "github.com/go-chi/chi/v5"
1922)
2023
24+ // knownFeatureFlags are the feature flags that can be enabled via X-MCP-Features header.
25+ // Only these flags are accepted from headers.
26+ var knownFeatureFlags = []string {
27+ github .FeatureFlagHoldbackConsolidatedProjects ,
28+ github .FeatureFlagHoldbackConsolidatedActions ,
29+ }
30+
2131type ServerConfig struct {
2232 // Version of the server
2333 Version string
@@ -83,7 +93,7 @@ func RunHTTPServer(cfg ServerConfig) error {
8393 repoAccessOpts = append (repoAccessOpts , lockdown .WithTTL (* cfg .RepoAccessCacheTTL ))
8494 }
8595
86- featureChecker := CreateHTTPFeatureChecker ( nil )
96+ featureChecker := createHTTPFeatureChecker ( )
8797
8898 deps := github .NewRequestDeps (
8999 apiHost ,
@@ -97,7 +107,7 @@ func RunHTTPServer(cfg ServerConfig) error {
97107
98108 r := chi .NewRouter ()
99109
100- handler := NewHTTPMcpHandler (ctx , & cfg , deps , t , logger , WithHandlerFeatureChecker (featureChecker ))
110+ handler := NewHTTPMcpHandler (ctx , & cfg , deps , t , logger , WithFeatureChecker (featureChecker ))
101111 handler .RegisterRoutes (r )
102112
103113 addr := fmt .Sprintf (":%d" , cfg .Port )
@@ -130,3 +140,20 @@ func RunHTTPServer(cfg ServerConfig) error {
130140 logger .Info ("server stopped gracefully" )
131141 return nil
132142}
143+
144+ // createHTTPFeatureChecker creates a feature checker that reads header features from context
145+ // and validates them against the knownFeatureFlags whitelist
146+ func createHTTPFeatureChecker () inventory.FeatureFlagChecker {
147+ // Pre-compute whitelist as set for O(1) lookup
148+ knownSet := make (map [string ]bool , len (knownFeatureFlags ))
149+ for _ , f := range knownFeatureFlags {
150+ knownSet [f ] = true
151+ }
152+
153+ return func (ctx context.Context , flag string ) (bool , error ) {
154+ if knownSet [flag ] && slices .Contains (ghcontext .GetHeaderFeatures (ctx ), flag ) {
155+ return true , nil
156+ }
157+ return false , nil
158+ }
159+ }
0 commit comments