{"record":{"id":"7d835ac806a658d9","repo":"googleapis/mcp-toolbox","slug":"description-is-required-for-tool-q-7d835a","errorCode":null,"errorMessage":"description is required for tool %q","messagePattern":"description is required for tool %q","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/tools/valkey/valkey.go","lineNumber":68,"sourceCode":"type Config struct {\n\ttools.ConfigBase `yaml:\",inline\"`\n\tType             string                 `yaml:\"type\" validate:\"required\"`\n\tSource           string                 `yaml:\"source\" validate:\"required\"`\n\tCommands         [][]string             `yaml:\"commands\" validate:\"required\"`\n\tParameters       parameters.Parameters  `yaml:\"parameters\"`\n\tAnnotations      *tools.ToolAnnotations `yaml:\"annotations,omitempty\"`\n}\n\n// validate interface\nvar _ tools.ToolConfig = Config{}\n\nfunc (cfg Config) ToolConfigType() string {\n\treturn resourceType\n}\n\nfunc (cfg Config) Initialize(context.Context) (tools.Tool, error) {\n\tif cfg.Description == \"\" {\n\t\treturn nil, fmt.Errorf(\"description is required for tool %q\", cfg.Name)\n\t}\n\n\treturn Tool{\n\t\tBaseTool: tools.NewBaseTool(\n\t\t\tcfg,\n\t\t\ttools.GetAnnotationsOrDefault(cfg.Annotations, tools.NewDestructiveAnnotations),\n\t\t\ttools.Manifest{Description: cfg.Description, Parameters: cfg.Parameters.Manifest(), AuthRequired: cfg.AuthRequired},\n\t\t\tcfg.Parameters,\n\t\t),\n\t}, nil\n}\n\n// validate interface\nvar _ tools.Tool = Tool{}\n\ntype Tool struct {\n\ttools.BaseTool[Config]\n}","sourceCodeStart":50,"sourceCodeEnd":86,"githubUrl":"https://github.com/googleapis/mcp-toolbox/blob/8cc6e09de2ad7b8bffc77751799585a1401a48eb/internal/tools/valkey/valkey.go#L50-L86","documentation":"Initialize rejects a tool configuration whose 'description' field is empty. Description is mandatory for this tool type (it feeds the LLM tool manifest), so the error fires during startup when the tools.yaml entry omits or leaves blank the 'description' key.","triggerScenarios":"Defining any valkey tool (e.g. valkey-execute-sql) in tools.yaml without a 'description' field, or calling Config.Initialize with cfg.Description == \"\"; tests explicitly exercise this path via TestFailInitialization-style setups.","commonSituations":"Hand-written configs missing the field; templated config generation producing empty descriptions; upgrading and adding new valkey tools without filling in the description.","solutions":["Add a non-empty 'description' to the valkey tool config in tools.yaml","Verify the YAML key is 'description' and not misspelled or wrongly indented","If building Config in code, set Description before Initialize"],"exampleFix":"# before\ntools:\n  valkey-sql:\n    kind: valkey-execute-sql\n    source: my-valkey\n# after\ntools:\n  valkey-sql:\n    kind: valkey-execute-sql\n    source: my-valkey\n    description: Executes Valkey commands against the source","handlingStrategy":"validation","validationCode":"if cfg.Description == \"\" {\n    return fmt.Errorf(\"valkey tool %q requires a description\", cfg.Name)\n}","typeGuard":null,"tryCatchPattern":"tool, err := cfg.Initialize(ctx)\nif err != nil && strings.Contains(err.Error(), \"description is required\") {\n    // add 'description:' to the valkey tool entry in tools.yaml\n}","preventionTips":["Include descriptions in your valkey tool config templates","Validate tool configs at CI time with a dry-run load","Don't omit shared fields when copying configs between tool kinds"],"tags":["go","tool-configuration","valkey","validation"],"backgroundTag":"missing-tool-description","analyzedSha":"8cc6e09de2ad7b8bffc77751799585a1401a48eb","analyzedAt":"2026-09-05T01:10:36.887Z","contentChangedAt":"2026-09-05T01:10:36.887Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}