googleapis/mcp-toolbox · error

error getting template params %s

Error message

error getting template params %s

What it means

ResolveTemplateParams wraps any error from GetParams with this message when resolving declared template parameters against the provided values map. It almost always wraps a 'missing parameter X' error — the statement cannot be rendered because a declared parameter has no value. The inner cause is appended to this prefix.

Source

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

// GetParams return the ParamValues that are associated with the Parameters.
func GetParams(params Parameters, paramValuesMap map[string]any) (ParamValues, error) {
	resultParamValues := make(ParamValues, 0)
	for _, p := range params {
		k := p.GetName()
		v, ok := paramValuesMap[k]
		if !ok {
			return nil, fmt.Errorf("missing parameter %s", k)
		}
		resultParamValues = append(resultParamValues, ParamValue{Name: k, Value: v})
	}
	return resultParamValues, nil
}

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
}

View on GitHub (pinned to 8cc6e09de2)

Solutions

  1. Supply values for every declared template parameter listed in the tool config.
  2. Fix mismatches between the argument keys sent and the declared parameter names.
  3. Add defaults in the parameter config for values that may be absent.
  4. Parse the wrapped 'missing parameter X' text to identify exactly which key to add.

Example fix

// before: incomplete map
resolveTemplateParams(params, sql, map[string]any{"table": "users"})

// after: all template params present
resolveTemplateParams(params, sql, map[string]any{"table": "users", "limit": 10})
Defensive patterns

Strategy: validation

Validate before calling

needed := map[string]bool{}
for _, p := range templateParams { needed[p.GetName()] = true }
for k := range paramsMap { delete(needed, k) }
if len(needed) > 0 {
    return fmt.Errorf("missing template params: %v", keys(needed))
}

Try / catch

out, err := params.ResolveTemplateParams(tp, stmt, m)
if err != nil && strings.Contains(err.Error(), "error getting template params") {
    // missing template parameter: surface which key to add
    return fmt.Errorf("invalid arguments: %w", err)
}

Prevention

When it happens

Trigger: ResolveTemplateParams invoked from Invoke or SubstituteMessages with a paramsMap lacking a key for a declared template parameter, e.g. rendering a SQL statement or HTTP body with incomplete arguments.

Common situations: Tool invocations with omitted required arguments; parameters renamed in config while callers still send old names; programmatic callers building the map and dropping a template param; auth values absent for unauthenticated requests.

Related errors


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