GenerateMCPScriptGoToolScript generates the Go script for a mcp-script tool Go scripts receive inputs as JSON via stdin and output JSON to stdout: - Input parameters are decoded from stdin into a map[string]any - Outputs are printed to stdout as JSON - Environment variables from env: field are avail
(toolConfig *MCPScriptToolConfig)
| 303 | // - Outputs are printed to stdout as JSON |
| 304 | // - Environment variables from env: field are available via os.Getenv() |
| 305 | func GenerateMCPScriptGoToolScript(toolConfig *MCPScriptToolConfig) string { |
| 306 | mcpScriptsLog.Printf("Generating Go tool script: tool=%s, input_count=%d", toolConfig.Name, len(toolConfig.Inputs)) |
| 307 | var sb strings.Builder |
| 308 | |
| 309 | sb.WriteString("package main\n\n") |
| 310 | sb.WriteString("// Auto-generated mcp-script tool: " + toolConfig.Name + "\n") |
| 311 | sb.WriteString(formatMultiLineComment(toolConfig.Description, "// ") + "\n") |
| 312 | sb.WriteString("import (\n") |
| 313 | sb.WriteString("\t\"encoding/json\"\n") |
| 314 | sb.WriteString("\t\"fmt\"\n") |
| 315 | sb.WriteString("\t\"io\"\n") |
| 316 | sb.WriteString("\t\"os\"\n") |
| 317 | sb.WriteString(")\n\n") |
| 318 | |
| 319 | sb.WriteString("func main() {\n") |
| 320 | sb.WriteString("\t// Read inputs from stdin (JSON format)\n") |
| 321 | sb.WriteString("\tvar inputs map[string]any\n") |
| 322 | sb.WriteString("\tinputData, err := io.ReadAll(os.Stdin)\n") |
| 323 | sb.WriteString("\tif err == nil && len(inputData) > 0 {\n") |
| 324 | sb.WriteString("\t\t_ = json.Unmarshal(inputData, &inputs)\n") |
| 325 | sb.WriteString("\t}\n") |
| 326 | sb.WriteString("\tif inputs == nil {\n") |
| 327 | sb.WriteString("\t\tinputs = make(map[string]any)\n") |
| 328 | sb.WriteString("\t}\n\n") |
| 329 | |
| 330 | // Add helper comment about input parameters |
| 331 | if len(toolConfig.Inputs) > 0 { |
| 332 | sb.WriteString("\t// Input parameters available in 'inputs' map:\n") |
| 333 | // Sort input names for stable code generation |
| 334 | inputNames := sliceutil.SortedKeys(toolConfig.Inputs) |
| 335 | for _, paramName := range inputNames { |
| 336 | param := toolConfig.Inputs[paramName] |
| 337 | fmt.Fprintf(&sb, "\t// %s := inputs[\"%s\"] // %s\n", stringutil.SanitizePythonVariableName(paramName), paramName, param.Description) |
| 338 | } |
| 339 | sb.WriteString("\n") |
| 340 | } |
| 341 | |
| 342 | // Add user's Go code with proper indentation |
| 343 | sb.WriteString("\t// User code:\n") |
| 344 | userCode := strings.TrimSpace(toolConfig.Go) |
| 345 | // Indent user code |
| 346 | indentedCode := strings.ReplaceAll(userCode, "\n", "\n\t") |
| 347 | sb.WriteString("\t" + indentedCode + "\n") |
| 348 | sb.WriteString("}\n") |
| 349 | |
| 350 | return sb.String() |
| 351 | } |