googleapis/mcp-toolbox · error

description is required for tool %q

Error message

description is required for tool %q

What it means

The sqlite-sql tool (parameterized SQL) requires a non-empty `description` in its config; Config.Initialize returns this error when cfg.Description is empty. The description is what the LLM sees in the tool manifest, so it cannot be blank.

Source

Thrown at internal/tools/sqlite/sqlitesql/sqlitesql.go:70

	tools.ConfigBase   `yaml:",inline"`
	Type               string                 `yaml:"type" validate:"required"`
	Source             string                 `yaml:"source" validate:"required"`
	Statement          string                 `yaml:"statement" validate:"required"`
	Parameters         parameters.Parameters  `yaml:"parameters"`
	TemplateParameters parameters.Parameters  `yaml:"templateParameters"`
	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, paramManifest, err := parameters.ProcessParameters(cfg.TemplateParameters, cfg.Parameters)
	if err != nil {
		return nil, err
	}

	return Tool{
		BaseTool: tools.NewBaseTool(
			cfg,
			tools.GetAnnotationsOrDefault(cfg.Annotations, tools.NewDestructiveAnnotations),
			tools.Manifest{Description: cfg.Description, Parameters: paramManifest, AuthRequired: cfg.AuthRequired},
			allParameters,
		),
	}, nil
}

// validate interface

View on GitHub (pinned to 8cc6e09de2)

Solutions

  1. Add a descriptive, non-empty `description:` to the sqlite-sql tool config.
  2. Verify YAML structure so description lands in the tool's Config struct.
  3. Check templated values render non-empty.

Example fix

# before
kind: sqlite-sql
source: my-sqlite
statement: SELECT * FROM users WHERE id = ?
# after
kind: sqlite-sql
source: my-sqlite
description: "Fetch a user by id."
statement: SELECT * FROM users WHERE id = ?
Defensive patterns

Strategy: validation

Validate before calling

yq '.tools[] | select(.kind == "sqlite-sql") | select(.description == null or .description == "")' tools.yaml

Type guard

func validToolConfig(c sqlite.Config) error {
    if c.Description == "" { return errors.New("description is required") }
    return nil
}

Try / catch

tool, err := cfg.Initialize(ctx)
if err != nil {
    return fmt.Errorf("invalid sqlite-sql tool %q: %w", cfg.Name, err)
}

Prevention

When it happens

Trigger: A `sqlite-sql` tool in tools.yaml lacking a `description:` key or having it set to ""; template substitution producing an empty description.

Common situations: Omitting description when scaffolding many similar tools; misindented YAML key; migration of configs from a version/variant where description was optional.

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/3faecdb9437f18cc. Report an issue: GitHub.