Skip to content

Commit bd73343

Browse files
committed
Simpler gateway code
Signed-off-by: David Gageot <david.gageot@docker.com>
1 parent 54db153 commit bd73343

2 files changed

Lines changed: 29 additions & 62 deletions

File tree

pkg/teamloader/teamloader.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ func createTool(ctx context.Context, toolset latest.Toolset, parentDir string, e
349349
return mcp.NewRemoteToolset(serverSpec.Remote.URL, serverSpec.Remote.TransportType, nil, runtimeConfig.RedirectURI), nil
350350
}
351351

352-
return mcp.NewGatewayToolset(mcpServerName, toolset.Config, envProvider), nil
352+
return mcp.NewGatewayToolset(ctx, mcpServerName, toolset.Config, envProvider)
353353

354354
case toolset.Type == "mcp" && toolset.Command != "":
355355
return mcp.NewToolsetCommand(toolset.Command, toolset.Args, env), nil

pkg/tools/mcp/gateway.go

Lines changed: 28 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"log/slog"
88
"os"
99
"strings"
10-
"sync"
1110

1211
"github.com/goccy/go-yaml"
1312

@@ -17,98 +16,74 @@ import (
1716
)
1817

1918
type GatewayToolset struct {
20-
mcpServerName string
21-
config any
22-
envProvider environment.Provider
23-
24-
once sync.Once
25-
initErr error
26-
cmdToolset *Toolset
27-
cleanUpConfig func() error
28-
cleanUpSecrets func() error
19+
cmdToolset *Toolset
20+
cleanUp func() error
2921
}
3022

3123
var _ tools.ToolSet = (*GatewayToolset)(nil)
3224

33-
func NewGatewayToolset(mcpServerName string, config any, envProvider environment.Provider) *GatewayToolset {
25+
func NewGatewayToolset(ctx context.Context, mcpServerName string, config any, envProvider environment.Provider) (*GatewayToolset, error) {
3426
slog.Debug("Creating MCP Gateway toolset", "name", mcpServerName)
3527

36-
return &GatewayToolset{
37-
mcpServerName: mcpServerName,
38-
config: config,
39-
envProvider: envProvider,
40-
41-
cleanUpConfig: func() error { return nil },
42-
cleanUpSecrets: func() error { return nil },
43-
}
44-
}
45-
46-
func (t *GatewayToolset) Instructions() string {
47-
return t.cmdToolset.Instructions()
48-
}
49-
50-
func (t *GatewayToolset) configureOnce(ctx context.Context) error {
5128
// Check which secrets (env vars) are required by the MCP server.
52-
secrets, err := gateway.RequiredEnvVars(ctx, t.mcpServerName)
29+
secrets, err := gateway.RequiredEnvVars(ctx, mcpServerName)
5330
if err != nil {
54-
return fmt.Errorf("reading which secrets the MCP server needs: %w", err)
31+
return nil, fmt.Errorf("reading which secrets the MCP server needs: %w", err)
5532
}
5633

5734
// Make sure all the required secrets are available in the environment.
5835
// TODO(dga): Ideally, the MCP gateway would use the same provider that we have.
59-
fileSecrets, err := writeSecretsToFile(ctx, t.mcpServerName, secrets, t.envProvider)
36+
fileSecrets, err := writeSecretsToFile(ctx, mcpServerName, secrets, envProvider)
6037
if err != nil {
61-
return fmt.Errorf("writing secrets to file: %w", err)
38+
return nil, fmt.Errorf("writing secrets to file: %w", err)
6239
}
63-
t.cleanUpSecrets = func() error { return os.Remove(fileSecrets) }
6440

65-
fileConfig, err := writeConfigToFile(ctx, t.mcpServerName, t.config)
41+
fileConfig, err := writeConfigToFile(ctx, mcpServerName, config)
6642
if err != nil {
67-
return fmt.Errorf("writing config to file: %w", err)
43+
os.Remove(fileSecrets)
44+
return nil, fmt.Errorf("writing config to file: %w", err)
6845
}
69-
t.cleanUpConfig = func() error { return os.Remove(fileConfig) }
7046

7147
// Isolate ourselves from the MCP Toolkit config by always using the Docker MCP catalog and custom config and secrets.
7248
// This improves shareability of agents.
7349
args := []string{
7450
"mcp", "gateway", "run",
75-
"--servers", t.mcpServerName,
51+
"--servers", mcpServerName,
7652
"--catalog", gateway.DockerCatalogURL,
7753
"--secrets", fileSecrets,
7854
"--config", fileConfig,
7955
}
80-
t.cmdToolset = NewToolsetCommand("docker", args, nil)
8156

82-
return nil
57+
return &GatewayToolset{
58+
cmdToolset: NewToolsetCommand("docker", args, nil),
59+
cleanUp: func() error {
60+
return errors.Join(os.Remove(fileSecrets), os.Remove(fileConfig))
61+
},
62+
}, nil
8363
}
8464

85-
func (t *GatewayToolset) ensureConfigured(ctx context.Context) error {
86-
t.once.Do(func() {
87-
t.initErr = t.configureOnce(ctx)
88-
})
89-
return t.initErr
65+
func (t *GatewayToolset) Instructions() string {
66+
return t.cmdToolset.Instructions()
9067
}
9168

9269
func (t *GatewayToolset) Tools(ctx context.Context) ([]tools.Tool, error) {
93-
if err := t.ensureConfigured(ctx); err != nil {
94-
return nil, err
95-
}
9670
return t.cmdToolset.Tools(ctx)
9771
}
9872

9973
func (t *GatewayToolset) Start(ctx context.Context) error {
100-
if err := t.ensureConfigured(ctx); err != nil {
101-
return err
102-
}
10374
return t.cmdToolset.Start(ctx)
10475
}
10576

106-
func (t *GatewayToolset) Stop(ctx context.Context) error {
107-
stopErr := t.cmdToolset.Stop(ctx)
108-
cleanUpSecretsErr := t.cleanUpSecrets()
109-
cleanUpConfigErr := t.cleanUpConfig()
77+
func (t *GatewayToolset) SetElicitationHandler(handler tools.ElicitationHandler) {
78+
t.cmdToolset.SetElicitationHandler(handler)
79+
}
80+
81+
func (t *GatewayToolset) SetOAuthSuccessHandler(handler func()) {
82+
t.cmdToolset.SetOAuthSuccessHandler(handler)
83+
}
11084

111-
return errors.Join(stopErr, cleanUpSecretsErr, cleanUpConfigErr)
85+
func (t *GatewayToolset) Stop(ctx context.Context) error {
86+
return errors.Join(t.cmdToolset.Stop(ctx), t.cleanUp())
11287
}
11388

11489
func writeSecretsToFile(ctx context.Context, mcpServerName string, secrets []gateway.Secret, envProvider environment.Provider) (string, error) {
@@ -150,11 +125,3 @@ func writeTempFile(nameTemplate string, content []byte) (string, error) {
150125

151126
return f.Name(), nil
152127
}
153-
154-
func (t *GatewayToolset) SetElicitationHandler(handler tools.ElicitationHandler) {
155-
t.cmdToolset.SetElicitationHandler(handler)
156-
}
157-
158-
func (t *GatewayToolset) SetOAuthSuccessHandler(handler func()) {
159-
t.cmdToolset.SetOAuthSuccessHandler(handler)
160-
}

0 commit comments

Comments
 (0)