@@ -4,13 +4,16 @@ import (
44 "context"
55 "errors"
66 "fmt"
7+ "log/slog"
78 "net/http"
89 "os"
910
1011 ghcontext "github.com/github/github-mcp-server/pkg/context"
1112 "github.com/github/github-mcp-server/pkg/http/transport"
1213 "github.com/github/github-mcp-server/pkg/inventory"
1314 "github.com/github/github-mcp-server/pkg/lockdown"
15+ "github.com/github/github-mcp-server/pkg/observability"
16+ obsvLog "github.com/github/github-mcp-server/pkg/observability/log"
1417 "github.com/github/github-mcp-server/pkg/raw"
1518 "github.com/github/github-mcp-server/pkg/scopes"
1619 "github.com/github/github-mcp-server/pkg/translations"
@@ -94,6 +97,9 @@ type ToolDependencies interface {
9497
9598 // IsFeatureEnabled checks if a feature flag is enabled.
9699 IsFeatureEnabled (ctx context.Context , flagName string ) bool
100+
101+ // Logger returns the logger
102+ Logger (ctx context.Context ) obsvLog.Logger
97103}
98104
99105// BaseDeps is the standard implementation of ToolDependencies for the local server.
@@ -113,6 +119,9 @@ type BaseDeps struct {
113119
114120 // Feature flag checker for runtime checks
115121 featureChecker inventory.FeatureFlagChecker
122+
123+ // Observability exporters (includes logger)
124+ Obsv observability.Exporters
116125}
117126
118127// Compile-time assertion to verify that BaseDeps implements the ToolDependencies interface.
@@ -128,7 +137,14 @@ func NewBaseDeps(
128137 flags FeatureFlags ,
129138 contentWindowSize int ,
130139 featureChecker inventory.FeatureFlagChecker ,
140+ logger * slog.Logger ,
131141) * BaseDeps {
142+ var obsv observability.Exporters
143+ if logger != nil {
144+ obsv = observability .NewExporters (obsvLog .NewSlogLogger (logger , obsvLog .InfoLevel ))
145+ } else {
146+ obsv = observability .NewExporters (obsvLog .NewNoopLogger ())
147+ }
132148 return & BaseDeps {
133149 Client : client ,
134150 GQLClient : gqlClient ,
@@ -138,6 +154,7 @@ func NewBaseDeps(
138154 Flags : flags ,
139155 ContentWindowSize : contentWindowSize ,
140156 featureChecker : featureChecker ,
157+ Obsv : obsv ,
141158 }
142159}
143160
@@ -170,6 +187,11 @@ func (d BaseDeps) GetFlags(_ context.Context) FeatureFlags { return d.Flags }
170187// GetContentWindowSize implements ToolDependencies.
171188func (d BaseDeps ) GetContentWindowSize () int { return d .ContentWindowSize }
172189
190+ // Logger implements ToolDependencies.
191+ func (d BaseDeps ) Logger (ctx context.Context ) obsvLog.Logger {
192+ return d .Obsv .Logger (ctx )
193+ }
194+
173195// IsFeatureEnabled checks if a feature flag is enabled.
174196// Returns false if the feature checker is nil, flag name is empty, or an error occurs.
175197// This allows tools to conditionally change behavior based on feature flags.
@@ -247,6 +269,9 @@ type RequestDeps struct {
247269
248270 // Feature flag checker for runtime checks
249271 featureChecker inventory.FeatureFlagChecker
272+
273+ // Observability exporters (includes logger)
274+ obsv observability.Exporters
250275}
251276
252277// NewRequestDeps creates a RequestDeps with the provided clients and configuration.
@@ -258,7 +283,14 @@ func NewRequestDeps(
258283 t translations.TranslationHelperFunc ,
259284 contentWindowSize int ,
260285 featureChecker inventory.FeatureFlagChecker ,
286+ logger * slog.Logger ,
261287) * RequestDeps {
288+ var obsv observability.Exporters
289+ if logger != nil {
290+ obsv = observability .NewExporters (obsvLog .NewSlogLogger (logger , obsvLog .InfoLevel ))
291+ } else {
292+ obsv = observability .NewExporters (obsvLog .NewNoopLogger ())
293+ }
262294 return & RequestDeps {
263295 apiHosts : apiHosts ,
264296 version : version ,
@@ -267,6 +299,7 @@ func NewRequestDeps(
267299 T : t ,
268300 ContentWindowSize : contentWindowSize ,
269301 featureChecker : featureChecker ,
302+ obsv : obsv ,
270303 }
271304}
272305
@@ -374,6 +407,11 @@ func (d *RequestDeps) GetFlags(ctx context.Context) FeatureFlags {
374407// GetContentWindowSize implements ToolDependencies.
375408func (d * RequestDeps ) GetContentWindowSize () int { return d .ContentWindowSize }
376409
410+ // Logger implements ToolDependencies.
411+ func (d * RequestDeps ) Logger (ctx context.Context ) obsvLog.Logger {
412+ return d .obsv .Logger (ctx )
413+ }
414+
377415// IsFeatureEnabled checks if a feature flag is enabled.
378416func (d * RequestDeps ) IsFeatureEnabled (ctx context.Context , flagName string ) bool {
379417 if d .featureChecker == nil || flagName == "" {
0 commit comments