Skip to content

Commit f3802d5

Browse files
committed
Move lockdown to context
1 parent 3e30fc8 commit f3802d5

File tree

3 files changed

+71
-50
lines changed

3 files changed

+71
-50
lines changed

internal/ghmcp/http.go

Lines changed: 51 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -88,53 +88,19 @@ func RunHTTPServer(cfg HTTPServerConfig) error {
8888
logger := slog.New(slogHandler)
8989
logger.Info("starting server", "version", cfg.Version, "host", cfg.Host, "dynamicToolsets", cfg.DynamicToolsets, "readOnly", cfg.ReadOnly, "lockdownEnabled", cfg.LockdownMode)
9090

91-
// Set up repo access cache for lockdown mode
92-
var opts []lockdown.RepoAccessOption
93-
if cfg.LockdownMode {
94-
opts = []lockdown.RepoAccessOption{
95-
lockdown.WithLogger(logger.With("component", "lockdown")),
96-
}
97-
if cfg.RepoAccessCacheTTL != nil {
98-
opts = append(opts, lockdown.WithTTL(*cfg.RepoAccessCacheTTL))
99-
}
100-
}
101-
10291
apiHost, err := utils.ParseAPIHost(cfg.Host)
10392
if err != nil {
10493
return fmt.Errorf("failed to parse API host: %w", err)
10594
}
10695

107-
deps := github.NewRequestDeps(
108-
&apiHost,
109-
cfg.Version,
110-
cfg.LockdownMode,
111-
opts,
112-
t,
113-
github.FeatureFlags{
114-
LockdownMode: cfg.LockdownMode,
115-
},
116-
cfg.ContentWindowSize,
117-
)
118-
119-
ghServer, err := github.NewMcpServer(&github.MCPServerConfig{
120-
Version: cfg.Version,
121-
Host: cfg.Host,
122-
EnabledToolsets: cfg.EnabledToolsets,
123-
EnabledTools: cfg.EnabledTools,
124-
EnabledFeatures: cfg.EnabledFeatures,
125-
DynamicToolsets: cfg.DynamicToolsets,
126-
ReadOnly: cfg.ReadOnly,
127-
Translator: t,
128-
ContentWindowSize: cfg.ContentWindowSize,
129-
LockdownMode: cfg.LockdownMode,
130-
Logger: logger,
131-
RepoAccessTTL: cfg.RepoAccessCacheTTL,
132-
}, deps)
133-
if err != nil {
134-
return fmt.Errorf("failed to create MCP server: %w", err)
96+
repoAccessOpts := []lockdown.RepoAccessOption{
97+
lockdown.WithLogger(logger.With("component", "lockdown")),
98+
}
99+
if cfg.RepoAccessCacheTTL != nil {
100+
repoAccessOpts = append(repoAccessOpts, lockdown.WithTTL(*cfg.RepoAccessCacheTTL))
135101
}
136102

137-
handler := NewHttpMcpHandler(&cfg, ghServer)
103+
handler := NewHttpMcpHandler(&cfg, t, &apiHost, repoAccessOpts, logger)
138104

139105
httpSvr := http.Server{
140106
Addr: ":8082",
@@ -166,20 +132,59 @@ func RunHTTPServer(cfg HTTPServerConfig) error {
166132
}
167133

168134
type HttpMcpHandler struct {
169-
config *HTTPServerConfig
170-
ghServer *mcp.Server
135+
config *HTTPServerConfig
136+
apiHosts utils.ApiHost
137+
logger *slog.Logger
138+
t translations.TranslationHelperFunc
139+
repoAccessOpts []lockdown.RepoAccessOption
171140
}
172141

173-
func NewHttpMcpHandler(cfg *HTTPServerConfig, mcpServer *mcp.Server) *HttpMcpHandler {
142+
func NewHttpMcpHandler(cfg *HTTPServerConfig,
143+
t translations.TranslationHelperFunc,
144+
apiHosts *utils.ApiHost,
145+
repoAccessOptions []lockdown.RepoAccessOption,
146+
logger *slog.Logger) *HttpMcpHandler {
174147
return &HttpMcpHandler{
175-
config: cfg,
176-
ghServer: mcpServer,
148+
config: cfg,
149+
apiHosts: *apiHosts,
150+
logger: logger,
151+
t: t,
152+
repoAccessOpts: repoAccessOptions,
177153
}
178154
}
179155

180156
func (s *HttpMcpHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
157+
// Set up repo access cache for lockdown mode
158+
deps := github.NewRequestDeps(
159+
&s.apiHosts,
160+
s.config.Version,
161+
s.repoAccessOpts,
162+
s.t,
163+
github.FeatureFlags{
164+
LockdownMode: s.config.LockdownMode,
165+
},
166+
s.config.ContentWindowSize,
167+
)
168+
169+
ghServer, err := github.NewMcpServer(&github.MCPServerConfig{
170+
Version: s.config.Version,
171+
Host: s.config.Host,
172+
EnabledToolsets: s.config.EnabledToolsets,
173+
EnabledTools: s.config.EnabledTools,
174+
EnabledFeatures: s.config.EnabledFeatures,
175+
DynamicToolsets: s.config.DynamicToolsets,
176+
ReadOnly: s.config.ReadOnly,
177+
Translator: s.t,
178+
ContentWindowSize: s.config.ContentWindowSize,
179+
Logger: s.logger,
180+
RepoAccessTTL: s.config.RepoAccessCacheTTL,
181+
}, deps)
182+
if err != nil {
183+
w.WriteHeader(http.StatusInternalServerError)
184+
}
185+
181186
mcpHandler := mcp.NewStreamableHTTPHandler(func(r *http.Request) *mcp.Server {
182-
return s.ghServer
187+
return ghServer
183188
}, &mcp.StreamableHTTPOptions{
184189
Stateless: true,
185190
})

pkg/context/lockdown.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package context
2+
3+
import "context"
4+
5+
// lockdownCtxKey is a context key for lockdown mode information
6+
type lockdownCtxKey struct{}
7+
8+
// WithLockdownMode adds lockdown mode information to the context
9+
func WithLockdownMode(ctx context.Context, enabled bool) context.Context {
10+
return context.WithValue(ctx, lockdownCtxKey{}, enabled)
11+
}
12+
13+
// IsLockdownMode retrieves lockdown mode information from the context
14+
func IsLockdownMode(ctx context.Context) bool {
15+
if enabled, ok := ctx.Value(lockdownCtxKey{}).(bool); ok {
16+
return enabled
17+
}
18+
return false
19+
}

pkg/github/dependencies.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,6 @@ type RequestDeps struct {
211211
GQLClient *githubv4.Client
212212
RawClient *raw.Client
213213
RepoAccessCache *lockdown.RepoAccessCache
214-
LockdownMode bool
215214

216215
// Static dependencies
217216
apiHosts *utils.ApiHost
@@ -226,7 +225,6 @@ type RequestDeps struct {
226225
func NewRequestDeps(
227226
apiHosts *utils.ApiHost,
228227
version string,
229-
lockdownMode bool,
230228
repoAccessOpts []lockdown.RepoAccessOption,
231229
t translations.TranslationHelperFunc,
232230
flags FeatureFlags,
@@ -235,7 +233,6 @@ func NewRequestDeps(
235233
return &RequestDeps{
236234
apiHosts: apiHosts,
237235
version: version,
238-
LockdownMode: lockdownMode,
239236
RepoAccessOpts: repoAccessOpts,
240237
T: t,
241238
Flags: flags,
@@ -301,7 +298,7 @@ func (d *RequestDeps) GetRawClient(ctx context.Context) (*raw.Client, error) {
301298

302299
// GetRepoAccessCache implements ToolDependencies.
303300
func (d *RequestDeps) GetRepoAccessCache(ctx context.Context) (*lockdown.RepoAccessCache, error) {
304-
if d.LockdownMode == false {
301+
if !ghcontext.IsLockdownMode(ctx) {
305302
return nil, nil
306303
}
307304

0 commit comments

Comments
 (0)