Skip to content

Commit a6fbcc8

Browse files
consolidate log functions in one package (#182)
* consolidate log functions in one package * Remove --central option * Make --transport option hidden
1 parent 00ca3c8 commit a6fbcc8

28 files changed

+241
-342
lines changed

cmd/docker-mcp/commands/gateway.go

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,6 @@ func gatewayCommand(docker docker.Client, dockerCli command.Cli) *cobra.Command
8686
options.Watch = false
8787
}
8888

89-
if options.Central {
90-
options.Watch = false
91-
options.Transport = "streaming"
92-
}
93-
9489
if options.Transport == "stdio" {
9590
if options.Port != 0 {
9691
return errors.New("cannot use --port with --transport=stdio")
@@ -178,10 +173,11 @@ func gatewayCommand(docker docker.Client, dockerCli command.Cli) *cobra.Command
178173
runCmd.Flags().IntVar(&options.Cpus, "cpus", options.Cpus, "CPUs allocated to each MCP Server (default is 1)")
179174
runCmd.Flags().StringVar(&options.Memory, "memory", options.Memory, "Memory allocated to each MCP Server (default is 2Gb)")
180175
runCmd.Flags().BoolVar(&options.Static, "static", options.Static, "Enable static mode (aka pre-started servers)")
176+
runCmd.Flags().StringVar(&options.LogFilePath, "log", options.LogFilePath, "Path to log file for stderr output (relative or absolute)")
181177

182178
// Very experimental features
183-
runCmd.Flags().BoolVar(&options.Central, "central", options.Central, "In central mode, clients tell us which servers to enable")
184-
_ = runCmd.Flags().MarkHidden("central")
179+
_ = runCmd.Flags().MarkHidden("transport")
180+
_ = runCmd.Flags().MarkHidden("log")
185181

186182
cmd.AddCommand(runCmd)
187183

docs/generator/reference/docker_mcp_gateway_run.yaml

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -76,16 +76,6 @@ options:
7676
experimentalcli: false
7777
kubernetes: false
7878
swarm: false
79-
- option: central
80-
value_type: bool
81-
default_value: "false"
82-
description: In central mode, clients tell us which servers to enable
83-
deprecated: false
84-
hidden: true
85-
experimental: false
86-
experimentalcli: false
87-
kubernetes: false
88-
swarm: false
8979
- option: config
9080
value_type: stringSlice
9181
default_value: '[config.yaml]'
@@ -149,6 +139,15 @@ options:
149139
experimentalcli: false
150140
kubernetes: false
151141
swarm: false
142+
- option: log
143+
value_type: string
144+
description: Path to log file for stderr output (relative or absolute)
145+
deprecated: false
146+
hidden: true
147+
experimental: false
148+
experimentalcli: false
149+
kubernetes: false
150+
swarm: false
152151
- option: log-calls
153152
value_type: bool
154153
default_value: "true"
@@ -278,7 +277,7 @@ options:
278277
default_value: stdio
279278
description: stdio, sse or streaming (default is stdio)
280279
deprecated: false
281-
hidden: false
280+
hidden: true
282281
experimental: false
283282
experimentalcli: false
284283
kubernetes: false

docs/generator/reference/mcp_gateway_run.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ Run the gateway
3232
| `--static` | `bool` | | Enable static mode (aka pre-started servers) |
3333
| `--tools` | `stringSlice` | | List of tools to enable |
3434
| `--tools-config` | `stringSlice` | `[tools.yaml]` | Paths to the tools files (absolute or relative to ~/.docker/mcp/) |
35-
| `--transport` | `string` | `stdio` | stdio, sse or streaming (default is stdio) |
3635
| `--verbose` | `bool` | | Verbose output |
3736
| `--verify-signatures` | `bool` | | Verify signatures of the server images |
3837
| `--watch` | `bool` | `true` | Watch for changes and reconfigure the gateway |

pkg/docker/logs.go

Lines changed: 0 additions & 14 deletions
This file was deleted.

pkg/docker/secrets.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"strings"
1212

1313
"github.com/docker/mcp-gateway/pkg/desktop"
14+
"github.com/docker/mcp-gateway/pkg/log"
1415
)
1516

1617
const jcatImage = "docker/jcat@sha256:76719466e8b99a65dd1d37d9ab94108851f009f0f687dce7ff8a6fc90575c4d4"
@@ -100,7 +101,7 @@ func (c *dockerClient) readSecretsOneByOneOptional(ctx context.Context, names []
100101
for _, name := range names {
101102
values, err := c.readSecrets(ctx, []string{name})
102103
if err != nil {
103-
logf("couldn't read secret %s: %v", name, err)
104+
log.Logf("couldn't read secret %s: %v", name, err)
104105
continue
105106
}
106107

pkg/gateway/capabilitites.go

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/modelcontextprotocol/go-sdk/mcp"
1313
"golang.org/x/sync/errgroup"
1414

15+
"github.com/docker/mcp-gateway/pkg/log"
1516
"github.com/docker/mcp-gateway/pkg/telemetry"
1617
)
1718

@@ -95,14 +96,14 @@ func (g *Gateway) listCapabilities(ctx context.Context, configuration Configurat
9596

9697
switch {
9798
case !found:
98-
log(" - MCP server not found:", serverName)
99+
log.Log(" - MCP server not found:", serverName)
99100

100101
// It's an MCP Server
101102
case serverConfig != nil:
102103
errs.Go(func() error {
103104
client, err := g.clientPool.AcquireClient(ctx, serverConfig, clientConfig)
104105
if err != nil {
105-
logf(" > Can't start %s: %s", serverConfig.Name, err)
106+
log.Logf(" > Can't start %s: %s", serverConfig.Name, err)
106107
return nil
107108
}
108109
defer g.clientPool.ReleaseClient(client)
@@ -111,7 +112,7 @@ func (g *Gateway) listCapabilities(ctx context.Context, configuration Configurat
111112

112113
tools, err := client.Session().ListTools(ctx, &mcp.ListToolsParams{})
113114
if err != nil {
114-
logf(" > Can't list tools %s: %s", serverConfig.Name, err)
115+
log.Logf(" > Can't list tools %s: %s", serverConfig.Name, err)
115116
} else {
116117
// Record the number of tools discovered from this server
117118
telemetry.RecordToolList(ctx, serverConfig.Name, len(tools.Tools))
@@ -170,21 +171,21 @@ func (g *Gateway) listCapabilities(ctx context.Context, configuration Configurat
170171
}
171172
}
172173

173-
var log string
174+
var logMsg string
174175
if len(capabilities.Tools) > 0 {
175-
log += fmt.Sprintf(" (%d tools)", len(capabilities.Tools))
176+
logMsg += fmt.Sprintf(" (%d tools)", len(capabilities.Tools))
176177
}
177178
if len(capabilities.Prompts) > 0 {
178-
log += fmt.Sprintf(" (%d prompts)", len(capabilities.Prompts))
179+
logMsg += fmt.Sprintf(" (%d prompts)", len(capabilities.Prompts))
179180
}
180181
if len(capabilities.Resources) > 0 {
181-
log += fmt.Sprintf(" (%d resources)", len(capabilities.Resources))
182+
logMsg += fmt.Sprintf(" (%d resources)", len(capabilities.Resources))
182183
}
183184
if len(capabilities.ResourceTemplates) > 0 {
184-
log += fmt.Sprintf(" (%d resourceTemplates)", len(capabilities.ResourceTemplates))
185+
logMsg += fmt.Sprintf(" (%d resourceTemplates)", len(capabilities.ResourceTemplates))
185186
}
186-
if log != "" {
187-
logf(" > %s:%s", serverConfig.Name, log)
187+
if logMsg != "" {
188+
log.Logf(" > %s:%s", serverConfig.Name, logMsg)
188189
}
189190

190191
lock.Lock()

pkg/gateway/clientpool.go

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"github.com/docker/mcp-gateway/pkg/docker"
1515
"github.com/docker/mcp-gateway/pkg/eval"
1616
"github.com/docker/mcp-gateway/pkg/gateway/proxies"
17+
"github.com/docker/mcp-gateway/pkg/log"
1718
mcpclient "github.com/docker/mcp-gateway/pkg/mcp"
1819
)
1920

@@ -165,23 +166,23 @@ func (cp *clientPool) InvalidateOAuthClients(provider string) {
165166
cp.clientLock.Lock()
166167
defer cp.clientLock.Unlock()
167168

168-
log(fmt.Sprintf("ClientPool: Invalidating OAuth clients for provider: %s", provider))
169+
log.Log(fmt.Sprintf("ClientPool: Invalidating OAuth clients for provider: %s", provider))
169170

170171
var invalidatedKeys []clientKey
171172
for key, keptClient := range cp.keptClients {
172173
// Check if this client uses OAuth for the specified provider
173174
if keptClient.Config.Spec.OAuth != nil {
174175
// Match by server name (for DCR providers, server name matches provider)
175176
if keptClient.Config.Name == provider {
176-
log(fmt.Sprintf("ClientPool: Closing OAuth connection for server: %s", keptClient.Config.Name))
177+
log.Log(fmt.Sprintf("ClientPool: Closing OAuth connection for server: %s", keptClient.Config.Name))
177178

178179
// Close the connection
179180
client, err := keptClient.Getter.GetClient(context.TODO())
180181
if err == nil {
181182
client.Session().Close()
182-
log(fmt.Sprintf("ClientPool: Successfully closed connection for %s", keptClient.Config.Name))
183+
log.Log(fmt.Sprintf("ClientPool: Successfully closed connection for %s", keptClient.Config.Name))
183184
} else {
184-
log(fmt.Sprintf("ClientPool: Warning - failed to get client for %s during invalidation: %v", keptClient.Config.Name, err))
185+
log.Log(fmt.Sprintf("ClientPool: Warning - failed to get client for %s during invalidation: %v", keptClient.Config.Name, err))
185186
}
186187

187188
// Mark for removal from kept clients
@@ -196,9 +197,9 @@ func (cp *clientPool) InvalidateOAuthClients(provider string) {
196197
}
197198

198199
if len(invalidatedKeys) > 0 {
199-
log(fmt.Sprintf("ClientPool: Invalidated %d OAuth connections for provider %s", len(invalidatedKeys), provider))
200+
log.Log(fmt.Sprintf("ClientPool: Invalidated %d OAuth connections for provider %s", len(invalidatedKeys), provider))
200201
} else {
201-
log(fmt.Sprintf("ClientPool: No active OAuth connections found for provider %s", provider))
202+
log.Log(fmt.Sprintf("ClientPool: No active OAuth connections found for provider %s", provider))
202203
}
203204
}
204205

@@ -240,7 +241,7 @@ func (cp *clientPool) runToolContainer(ctx context.Context, tool catalog.Tool, p
240241
command := eval.EvaluateList(tool.Container.Command, arguments)
241242
args = append(args, command...)
242243

243-
log(" - Running container", tool.Container.Image, "with args", args)
244+
log.Log(" - Running container", tool.Container.Image, "with args", args)
244245

245246
cmd := exec.CommandContext(ctx, "docker", args...)
246247
if cp.Verbose {
@@ -325,7 +326,7 @@ func (cp *clientPool) argsAndEnv(serverConfig *catalog.ServerConfig, readOnly *b
325326
if ok {
326327
env = append(env, fmt.Sprintf("%s=%s", s.Env, secretValue))
327328
} else {
328-
logf("Warning: Secret '%s' not found for server '%s', setting %s=<UNKNOWN>", s.Name, serverConfig.Name, s.Env)
329+
log.Logf("Warning: Secret '%s' not found for server '%s', setting %s=<UNKNOWN>", s.Name, serverConfig.Name, s.Env)
329330
env = append(env, fmt.Sprintf("%s=%s", s.Env, "<UNKNOWN>"))
330331
}
331332
}
@@ -446,9 +447,9 @@ func (cg *clientGetter) GetClient(ctx context.Context) (mcpclient.Client, error)
446447

447448
command := expandEnvList(eval.EvaluateList(cg.serverConfig.Spec.Command, cg.serverConfig.Config), env)
448449
if len(command) == 0 {
449-
log(" - Running", imageBaseName(image), "with", args)
450+
log.Log(" - Running", imageBaseName(image), "with", args)
450451
} else {
451-
log(" - Running", imageBaseName(image), "with", args, "and command", command)
452+
log.Log(" - Running", imageBaseName(image), "with", args, "and command", command)
452453
}
453454

454455
var runArgs []string

pkg/gateway/config.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ type Options struct {
3131
Cpus int
3232
Memory string
3333
Static bool
34-
Central bool
3534
OAuthInterceptorEnabled bool
3635
McpOAuthDcrEnabled bool
3736
DynamicTools bool
37+
LogFilePath string
3838
}

0 commit comments

Comments
 (0)