Skip to content

Commit f220423

Browse files
committed
Set all required environment variables and arguments when updating tools for an MCP server
this also prints the logs in case there's an error. Signed-off-by: Juan Antonio Osorio <[email protected]>
1 parent 3f0ec62 commit f220423

File tree

3 files changed

+51
-9
lines changed

3 files changed

+51
-9
lines changed

cmd/update-tools/main.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ func fetchToolsFromMCP(serverName string) ([]string, error) {
199199
}
200200

201201
// Run the MCP server
202+
logger.Infof("Starting temporary MCP server: %s", serverName)
202203
tempName, err := client.RunServer(spec, serverName)
203204
if err != nil {
204205
return nil, fmt.Errorf("failed to run server: %w", err)
@@ -208,14 +209,22 @@ func fetchToolsFromMCP(serverName string) ([]string, error) {
208209
if err := client.StopServer(tempName); err != nil {
209210
logger.Warnf("Failed to stop temporary server %s: %v", tempName, err)
210211
}
211-
if err := client.RemoveServer(tempName); err != nil {
212-
logger.Warnf("Failed to remove temporary server %s: %v", tempName, err)
213-
}
212+
//if err := client.RemoveServer(tempName); err != nil {
213+
// logger.Warnf("Failed to remove temporary server %s: %v", tempName, err)
214+
//}
214215
}()
215216

216217
// Query the server for tools
217218
tools, err := client.ListTools(tempName)
218219
if err != nil {
220+
// Get Logs for debugging
221+
logs, logErr := client.Logs(tempName)
222+
if logErr != nil {
223+
logger.Warnf("Failed to fetch logs from temporary server %s: %v", tempName, logErr)
224+
}
225+
if logs != "" {
226+
logger.Infof("Logs from temporary server %s:\n%s", tempName, logs)
227+
}
219228
return nil, fmt.Errorf("failed to list tools: %w", err)
220229
}
221230

pkg/toolhive/builder.go

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,19 @@ func BuildRunCommand(spec *types.RegistryEntry, tempName, image string) []string
6565
// Add environment variables
6666
if spec.ImageMetadata.EnvVars != nil {
6767
for _, envVar := range spec.ImageMetadata.EnvVars {
68-
if envVar.Secret {
69-
// For secrets, use placeholder values if required
70-
if envVar.Required {
71-
builder.AddEnvVar(envVar.Name, "placeholder")
72-
}
73-
} else if envVar.Default != "" {
68+
// Precedence: explicit default from spec > required flag > secret flag
69+
if envVar.Default != "" {
7470
builder.AddEnvVar(envVar.Name, envVar.Default)
71+
continue
72+
}
73+
if envVar.Required {
74+
// Inject a dummy value to allow server startup and tool discovery
75+
builder.AddEnvVar(envVar.Name, "placeholder")
76+
continue
77+
}
78+
if envVar.Secret {
79+
// Even when not required, inject a dummy for secrets to surface optional tools
80+
builder.AddEnvVar(envVar.Name, "placeholder")
7581
}
7682
}
7783
}
@@ -85,5 +91,16 @@ func BuildRunCommand(spec *types.RegistryEntry, tempName, image string) []string
8591
// Add the image as the last positional argument
8692
builder.AddPositional(image)
8793

94+
// Append registry-specified args after the image using the standard "--" separator
95+
// per ToolHive docs (arguments after "--" are passed to the server process).
96+
if spec.ImageMetadata != nil && len(spec.Args) > 0 {
97+
builder.AddPositional("--")
98+
for _, a := range spec.Args {
99+
if a != "" {
100+
builder.AddPositional(a)
101+
}
102+
}
103+
}
104+
88105
return builder.Build()
89106
}

pkg/toolhive/client.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,22 @@ func (c *Client) ListTools(serverName string) ([]string, error) {
9494
return ParseToolsJSON(string(output))
9595
}
9696

97+
// Logs retrieves logs from a running MCP server
98+
func (c *Client) Logs(serverName string) (string, error) {
99+
logsArgs := NewCommandBuilder("logs").
100+
AddFlag("--follow", "false").
101+
AddPositional(serverName).
102+
Build()
103+
104+
logsCmd := exec.Command(c.thvPath, logsArgs...) // #nosec G204 - thvPath is validated in NewClient
105+
output, err := logsCmd.CombinedOutput()
106+
if err != nil {
107+
return "", fmt.Errorf("thv logs failed: %w\nOutput: %s", err, string(output))
108+
}
109+
110+
return string(output), nil
111+
}
112+
97113
// StopServer stops a running MCP server
98114
func (c *Client) StopServer(serverName string) error {
99115
stopCmd := exec.Command(c.thvPath, "stop", serverName) // #nosec G204 - thvPath is validated in NewClient

0 commit comments

Comments
 (0)