googleapis/mcp-toolbox · error

description is required for tool %q

Error message

description is required for tool %q

What it means

Config validation error from looker-get-connection-tables: Initialize rejects any tool config whose `description` field is empty. Descriptions are mandatory because they are shown to the LLM consuming the MCP tool, so a Looker tool without one is considered misconfigured and the server refuses to build it.

Source

Thrown at internal/tools/looker/lookergetconnectiontables/lookergetconnectiontables.go:71

}

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)
	}

	connParameter := parameters.NewStringParameter("conn", "The connection containing the tables.")
	dbParameter := parameters.NewStringParameter("db", "The optional database to search", parameters.WithStringRequired(false))
	schemaParameter := parameters.NewStringParameter("schema", "The schema containing the tables.")
	params := parameters.Parameters{connParameter, dbParameter, schemaParameter}

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

View on GitHub (pinned to 8cc6e09de2)

Solutions

  1. Add a non-empty `description:` to the looker-get-connection-tables tool entry in your config.
  2. Check that any templating/variable substitution actually fills the description (not an empty default).
  3. Validate the config before startup (e.g. a YAML schema check or dry-run).
  4. Copy the canonical tool example from the Looker docs, which includes a description.

Example fix

# before
tools:
  looker-get-connection-tables:
    kind: looker-get-connection-tables
    source: my-looker
# after
tools:
  looker-get-connection-tables:
    kind: looker-get-connection-tables
    source: my-looker
    description: Retrieves the list of tables in a Looker connection, optionally filtered by database and schema.
Defensive patterns

Strategy: validation

Validate before calling

// config check before loading
cfg, _ := readToolConfig(path)
if cfg.Description == "" {
    return fmt.Errorf("tool %s: description is required", cfg.Name)
}

Type guard

func hasDescription(c lookergetconnectiontables.Config) bool { return c.Description != "" }

Try / catch

tool, err := cfg.Initialize(ctx)
if err != nil {
    log.Fatalf("invalid looker-get-connection-tables config: %v", err)
}

Prevention

When it happens

Trigger: Calling Config.Initialize (during server/toolbox startup) with a looker-get-connection-tables tool definition that omits the description field or sets it to "" in the YAML/JSON config.

Common situations: Hand-authoring tools.yaml and forgetting the description key; templated configs where an empty variable renders as an empty string; copy-pasting a minimal tool block stripped of the description; a loader that drops empty fields.

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/5cf9afb8b3390f82. Report an issue: GitHub.