{"record":{"id":"b06e7a2f4b484d80","repo":"googleapis/mcp-toolbox","slug":"dataplex-catalog-client-is-nil","errorCode":null,"errorMessage":"dataplex catalog client is nil","messagePattern":"dataplex catalog client is nil","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/sources/dataplex/searchcatalog/search_catalog.go","lineNumber":100,"sourceCode":"\t\tqueryParts = append(queryParts, \"system=\"+system)\n\t}\n\n\treturn fmt.Sprintf(\"%s %s\", prompt, strings.Join(queryParts, \" AND \"))\n}\n\n// ExtractType extracts the mapped type from a resource string based on a type map.\nfunc ExtractType(resourceString string, typeMap map[string]string) string {\n\tlastIndex := strings.LastIndex(resourceString, \"/\")\n\tif lastIndex == -1 {\n\t\treturn resourceString\n\t}\n\treturn typeMap[resourceString[lastIndex+1:]]\n}\n\n// ExecuteSearch performs the search and processes results.\nfunc ExecuteSearch(ctx context.Context, client *dataplexapi.CatalogClient, req *dataplexpb.SearchEntriesRequest, typeMap map[string]string) ([]DataplexSearchResponse, error) {\n\tif client == nil {\n\t\treturn nil, fmt.Errorf(\"dataplex catalog client is nil\")\n\t}\n\tit := client.SearchEntries(ctx, req)\n\tif it == nil {\n\t\treturn nil, fmt.Errorf(\"failed to create search entries iterator\")\n\t}\n\n\tvar results []DataplexSearchResponse\n\tfor req.PageSize <= 0 || len(results) < int(req.PageSize) {\n\t\tentry, err := it.Next()\n\t\tif err == iterator.Done {\n\t\t\tbreak\n\t\t}\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tentrySource := entry.DataplexEntry.GetEntrySource()\n\n\t\tresp := DataplexSearchResponse{","sourceCodeStart":82,"sourceCodeEnd":118,"githubUrl":"https://github.com/googleapis/mcp-toolbox/blob/8cc6e09de2ad7b8bffc77751799585a1401a48eb/internal/sources/dataplex/searchcatalog/search_catalog.go#L82-L118","documentation":"ExecuteSearch is the package-level search runner for the Dataplex searchcatalog tool and requires a *dataplexapi.CatalogClient. A nil client means the searchcatalog source was never initialized with a working CatalogClient, so no search can be issued. The guard prevents a nil-pointer panic deep inside SearchEntries.","triggerScenarios":"Invoking the search_catalog tool when the enclosing Dataplex source failed to construct its CatalogClient (disabled API, missing credentials, source config skipped catalog client creation) and passed nil into ExecuteSearch.","commonSituations":"Dataplex API not enabled on the project; credential/ADC setup failure during source initialization; running the tool against a source variant that only initializes the DataScan client.","solutions":["Verify the Dataplex Catalog API (dataplex.googleapis.com) is enabled","Re-initialize the Dataplex source with valid credentials so the CatalogClient is created","Check the source config/Region so the client is built for the intended project","Add an init-time check that logs/warns when CatalogClient is nil instead of failing at search time"],"exampleFix":"// before\nres, err := searchcatalog.ExecuteSearch(ctx, nil, req, typeMap)\n// after\nif client == nil {\n    return nil, errors.New(\"catalog client missing: re-initialize dataplex source\")\n}\nres, err := searchcatalog.ExecuteSearch(ctx, client, req, typeMap)","handlingStrategy":"type-guard","validationCode":"if client == nil { return errors.New(\"catalog client missing: re-initialize dataplex source\") }","typeGuard":"func hasCatalogClient(s *sources.Dataplex) bool { return s != nil && s.CatalogClient != nil }","tryCatchPattern":"res, err := searchcatalog.ExecuteSearch(ctx, client, req, typeMap)\nif err != nil {\n\tif strings.Contains(err.Error(), \"catalog client is nil\") {\n\t\t// re-create the dataplex source / enable API\n\t}\n\treturn err\n}","preventionTips":["Enable the Dataplex API and verify credentials at startup","Fail fast at source init if the CatalogClient cannot be created","Health-check the client before exposing the search tool"],"tags":["dataplex","nil-client","searchcatalog","gcp"],"backgroundTag":"nil-client-reference","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"}