googleapis/mcp-toolbox · error

error executing go template %s

Error message

error executing go template %s

What it means

ResolveTemplateParams wraps template.Execute failures with this message. The template parsed correctly, but rendering against the resolved parameter values failed — commonly referencing a key not present in templateParamsMap, wrong-arity helper calls, or type errors during pipeline evaluation.

Source

Thrown at internal/util/parameters/parameters.go:296

func ResolveTemplateParams(templateParams Parameters, originalStatement string, paramsMap map[string]any) (string, error) {
	templateParamsValues, err := GetParams(templateParams, paramsMap)
	templateParamsMap := templateParamsValues.AsMap()
	if err != nil {
		return "", fmt.Errorf("error getting template params %s", err)
	}

	funcMap := template.FuncMap{
		"array": ConvertArrayParamToString,
	}
	t, err := template.New("statement").Funcs(funcMap).Parse(originalStatement)
	if err != nil {
		return "", fmt.Errorf("error creating go template %s", err)
	}
	var result bytes.Buffer
	err = t.Execute(&result, templateParamsMap)
	if err != nil {
		return "", fmt.Errorf("error executing go template %s", err)
	}

	modifiedStatement := result.String()
	return modifiedStatement, nil
}

// ProcessParameters concatenate templateParameters and parameters from a tool.
// It returns a list of concatenated parameters, concatenated Toolbox manifest, and concatenated MCP Manifest.
func ProcessParameters(templateParams Parameters, params Parameters) (Parameters, []ParameterManifest, error) {
	allParameters := slices.Concat(params, templateParams)

	// verify no duplicate parameter names
	err := CheckDuplicateParameters(allParameters)
	if err != nil {
		return nil, nil, err
	}

	// verify parameter restrictions

View on GitHub (pinned to 8cc6e09de2)

Solutions

  1. Ensure every {{.name}} in the statement matches a declared parameter that has a value; add defaults for optional ones.
  2. Read the wrapped Execute error detail — it names the offending expression.
  3. Only use the provided 'array' helper and pass it a string array.
  4. Test the statement with representative parameter values before shipping the tool config.

Example fix

# before: {{.limit}} never supplied
SELECT * FROM {{.table}} LIMIT {{.limit}}

# after: parameter declared with default
parameters:
  - name: limit
    type: integer
    default: 10
statement: SELECT * FROM {{.table}} LIMIT {{.limit}}
Defensive patterns

Strategy: validation

Validate before calling

// dry-run render with sample values before invoking
tmpl, err := template.New("s").Funcs(funcMap).Parse(stmt)
if err == nil {
    if err := tmpl.Execute(io.Discard, sampleParamMap); err != nil {
        return fmt.Errorf("template render check failed: %w", err)
    }
}

Try / catch

out, err := params.ResolveTemplateParams(tp, stmt, m)
if err != nil && strings.Contains(err.Error(), "error executing go template") {
    return fmt.Errorf("failed rendering statement with provided arguments: %w", err)
}

Prevention

When it happens

Trigger: Executing the parsed statement when a {{.field}} names a key missing from the resolved map, {{array}} receives a non-array value, or a pipeline performs an operation unsupported for the value's type (e.g. indexing a scalar).

Common situations: Typos between statement placeholders and declared parameter names; optional parameters without defaults missing at render time; nested-field access {{.a.b}} on scalar params; invoking undeclared helpers.

Related errors


AI-assisted analysis of googleapis/mcp-toolbox@8cc6e09de2 (2026-09-05). Data as JSON: /api/errors/f9cddc9e2365422b. Report an issue: GitHub.