googleapis/mcp-toolbox · error

description is required for tool %q

Error message

description is required for tool %q

What it means

Config.Initialize for looker-health-pulse requires a non-empty Description and returns this error otherwise. The description is required because it is surfaced to MCP clients as the tool's documentation. Validation happens immediately at tool initialization, so misconfigured YAML fails at startup rather than at request time.

Source

Thrown at internal/tools/looker/lookerhealthpulse/lookerhealthpulse.go:76

}

type Config struct {
	tools.ConfigBase `yaml:",inline"`
	Type             string                 `yaml:"type" validate:"required"`
	Source           string                 `yaml:"source" validate:"required"`
	Parameters       map[string]any         `yaml:"parameters"`
	Annotations      *tools.ToolAnnotations `yaml:"annotations,omitempty"`
}

var _ tools.ToolConfig = Config{}

func (cfg Config) ToolConfigType() string {
	return resourceType
}

func (cfg Config) Initialize(context.Context) (tools.Tool, error) {
	if cfg.Description == "" {
		return nil, fmt.Errorf("description is required for tool %q", cfg.Name)
	}

	actionParameter := parameters.NewStringParameter("action", "The health check to run. Can be either: `check_db_connections`, `check_dashboard_performance`,`check_dashboard_errors`,`check_explore_performance`,`check_schedule_failures`, or `check_legacy_features`", parameters.WithStringRequired(true))

	allParameters := parameters.Parameters{
		actionParameter,
	}

	// finish tool setup
	return Tool{
		BaseTool: tools.NewBaseTool(
			cfg,
			tools.GetAnnotationsOrDefault(cfg.Annotations, tools.NewReadOnlyAnnotations),
			tools.Manifest{Description: cfg.Description, Parameters: allParameters.Manifest(), AuthRequired: cfg.AuthRequired},
			allParameters,
		),
	}, nil
}

View on GitHub (pinned to 8cc6e09de2)

Solutions

  1. Set a descriptive description for the tool in tools.yaml.
  2. Fix YAML indentation/typo so description is recognized under the tool.
  3. Run the toolbox locally to confirm config loads without error.
  4. Add config linting or schema validation to CI for tools.yaml.

Example fix

// before
my_pulse:
  kind: looker-health-pulse
  source: my-looker-instance
// after
my_pulse:
  kind: looker-health-pulse
  source: my-looker-instance
  description: Runs health checks on Looker such as DB connections, dashboard performance, and schedule failures.
Defensive patterns

Strategy: validation

Validate before calling

if cfg.Name != "" && cfg.Description == "" {
    return fmt.Errorf("tool %q: description is required", cfg.Name)
}

Try / catch

tool, err := cfg.Initialize(ctx)
if err != nil && strings.Contains(err.Error(), "description is required") {
    return fmt.Errorf("fix tools.yaml: set description for %q", cfg.Name)
}

Prevention

When it happens

Trigger: A looker-health-pulse tool entry in tools.yaml (or a Config built in code) lacks the description field or has it set to an empty string when Initialize is called.

Common situations: Forgotten description key when copying an existing tool block, YAML typo like `descriptions:` or wrong indentation, template-generated configs omitting the field.

Understand the failure class

Background: "is required", "must be set", "missing required field": configuration validation errors across open-source libraries — this error's family across 36 libraries.

Related errors


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