{"record":{"id":"d8fb738029a26b26","repo":"googleapis/mcp-toolbox","slug":"description-is-required-for-tool-q-d8fb73","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/cloudloggingadmin/cloudloggingadminquerylogs/cloudloggingadminquerylogs.go","lineNumber":72,"sourceCode":"}\n\ntype Config struct {\n\ttools.ConfigBase `yaml:\",inline\"`\n\tType             string                 `yaml:\"type\" validate:\"required\"`\n\tSource           string                 `yaml:\"source\" validate:\"required\"`\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\tstartTimeDescription := fmt.Sprintf(\"Start time in RFC3339 format (e.g., 2025-12-09T00:00:00Z). Defaults to %d days ago.\", defaultStartTimeOffsetDays)\n\tlimitDescription := fmt.Sprintf(\"Maximum number of log entries to return. Default: %d.\", defaultLimit)\n\tparams := parameters.Parameters{\n\t\tparameters.NewStringParameter(\n\t\t\t\"filter\",\n\t\t\t\"Cloud Logging filter query. Common fields: resource.type, resource.labels.*, logName, severity, textPayload, jsonPayload.*, protoPayload.*, labels.*, httpRequest.*. Operators: =, !=, <, <=, >, >=, :, =~, AND, OR, NOT.\", parameters.WithStringRequired(false)),\n\t\tparameters.NewBooleanParameter(\"newestFirst\", \"Set to true for newest logs first. Defaults to oldest first.\", parameters.WithBooleanRequired(false)),\n\t\tparameters.NewStringParameter(\"startTime\", startTimeDescription, parameters.WithStringRequired(false)),\n\t\tparameters.NewStringParameter(\"endTime\", \"End time in RFC3339 format (e.g., 2025-12-09T23:59:59Z). Defaults to now.\", parameters.WithStringRequired(false)),\n\t\tparameters.NewBooleanParameter(\"verbose\", \"Include additional fields (insertId, trace, spanId, httpRequest, labels, operation, sourceLocation). Defaults to false.\", parameters.WithBooleanRequired(false)),\n\t\tparameters.NewIntParameter(\"limit\", limitDescription, parameters.WithIntRequired(false)),\n\t}\n\n\treturn Tool{\n\t\tBaseTool: tools.NewBaseTool(\n\t\t\tcfg,","sourceCodeStart":54,"sourceCodeEnd":90,"githubUrl":"https://github.com/googleapis/mcp-toolbox/blob/8cc6e09de2ad7b8bffc77751799585a1401a48eb/internal/tools/cloudloggingadmin/cloudloggingadminquerylogs/cloudloggingadminquerylogs.go#L54-L90","documentation":"Config.Initialize for cloudloggingadmin-querylogs enforces a non-empty 'description' because it is required to build the MCP tool manifest. A missing or empty description aborts tool initialization with this error.","triggerScenarios":"Loading a tools.yaml whose cloudloggingadmin-querylogs tool entry lacks `description` or sets it to \"\".","commonSituations":"Minimal/hand-written tool configs; YAML nesting errors putting description at the wrong level; generated configs from scripts that leave description blank.","solutions":["Add a meaningful non-empty `description:` to the querylogs tool entry.","Check indentation so description actually lands inside the tool's mapping.","Fix the tool named in the error message (cfg.Name) rather than scanning the whole file."],"exampleFix":"// before\n  query-logs:\n    kind: cloud-logging-admin-query-logs\n    source: my-logging-source\n// after\n  query-logs:\n    kind: cloud-logging-admin-query-logs\n    source: my-logging-source\n    description: Queries Cloud Logging entries with an optional filter, start time, and limit.","handlingStrategy":"validation","validationCode":"// Go: check required config fields before Initialize\nif cfg.Name == \"\" || cfg.Description == \"\" {\n    return nil, fmt.Errorf(\"tool %q: name and description are required\", cfg.Name)\n}","typeGuard":null,"tryCatchPattern":"tool, err := cfg.Initialize(ctx)\nif err != nil && strings.Contains(err.Error(), \"description is required\") {\n    return nil, fmt.Errorf(\"tools.yaml: add description for tool %q\", cfg.Name)\n}","preventionTips":["Treat description as a mandatory field in your tools.yaml template.","Add a CI schema check (e.g. JSON schema / yamllint with required keys).","If generating configs programmatically, assert description non-empty before writing YAML."],"tags":["go","config","validation","yaml"],"backgroundTag":"missing-required-argument","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"}