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
- Set a descriptive description for the tool in tools.yaml.
- Fix YAML indentation/typo so description is recognized under the tool.
- Run the toolbox locally to confirm config loads without error.
- 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
- Never leave description empty in tool YAML blocks
- Enforce required fields with a JSON/YAML schema in CI
- Validate config with `go run .` before merging
- Use descriptions that also document valid action enums for the LLM
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
- description is required for tool %q
- description is required for tool %q
- description is required for tool %q
- description is required for tool %q
- description is required for tool %q
AI-assisted analysis of googleapis/mcp-toolbox@8cc6e09de2 (2026-09-05).
Data as JSON: /api/errors/b00442a1d4ffb3e8.
Report an issue: GitHub.