77 "log/slog"
88 "os"
99 "strings"
10- "sync"
1110
1211 "github.com/goccy/go-yaml"
1312
@@ -17,98 +16,74 @@ import (
1716)
1817
1918type 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
3123var _ 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
9269func (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
9973func (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
11489func 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