googleapis/mcp-toolbox · error

description is required for tool %q

Error message

description is required for tool %q

What it means

Config.Initialize for the looker-make-look tool checks that `description` is set before assembling parameters (via lookercommon.GetQueryParameters plus the title parameter) and building the tool. An empty description aborts initialization with this error, since MCP tool specs require a description.

Source

Thrown at internal/tools/looker/lookermakelook/lookermakelook.go:75

}

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

// validate interface
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)
	}

	allParameters := lookercommon.GetQueryParameters()

	titleParameter := parameters.NewStringParameter("title", "The title of the Look")
	allParameters = append(allParameters, titleParameter)
	descParameter := parameters.NewStringParameter("description", "The description of the Look", parameters.WithStringDefault(""))
	allParameters = append(allParameters, descParameter)
	folderParameter := parameters.NewStringParameter("folder", "The folder id where the Look will be created. Leave blank to use the user's personal folder", parameters.WithStringDefault(""))
	allParameters = append(allParameters, folderParameter)
	vizParameter := parameters.NewMapParameter("vis_config", "The visualization config for the query", "", parameters.WithMapDefault(
		map[string]any{}))
	allParameters = append(allParameters, vizParameter)

	// finish tool setup
	return Tool{
		BaseTool: tools.NewBaseTool(
			cfg,

View on GitHub (pinned to 8cc6e09de2)

Solutions

  1. Add a non-empty `description` to the looker-make-look tool entry.
  2. Confirm the description is at the tool's top level in the YAML block.
  3. For code-built configs, assign cfg.Description before Initialize.

Example fix

# before
tools:
  make-look:
    kind: looker-make-look
    source: my-looker

# after
tools:
  make-look:
    kind: looker-make-look
    source: my-looker
    description: Creates a Looker Look from a query and title
Defensive patterns

Strategy: validation

Validate before calling

// Go: validate before Initialize
if cfg.Description == "" {
    return fmt.Errorf("tool %q is missing its description", cfg.Name)
}
// YAML lint: every looker-make-look entry must define a non-empty description

Try / catch

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

Prevention

When it happens

Trigger: Loading a tools.yaml entry of kind looker-make-look without a `description` field (or with an empty string), triggering the guard at the top of Initialize.

Common situations: Omitting description while copy-editing YAML; generators producing skeleton configs; misindentation causing the value to land under another key; empty string left after stripping placeholder text.

Understand the failure class

Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.

Related errors


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