{"record":{"id":"dfb6ae1f1dd0d982","repo":"googleapis/mcp-toolbox","slug":"invalid-source-for-q-tool-source-q-is-not-a-com-dfb6ae","errorCode":null,"errorMessage":"invalid source for %q tool: source %q is not a compatible type","messagePattern":"invalid source for %q tool: source %q is not a compatible type","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/tools/cloudhealthcare/cloudhealthcaregetfhirstoremetrics/cloudhealthcaregetfhirstoremetrics.go","lineNumber":101,"sourceCode":"// validate interface\nvar _ tools.Tool = Tool{}\n\ntype Tool struct {\n\ttools.BaseTool[Config]\n}\n\nfunc (t Tool) GetSourceName() string {\n\treturn t.Cfg.Source\n}\n\nfunc (t Tool) ToConfig() tools.ToolConfig {\n\treturn t.Cfg\n}\n\nfunc (t Tool) ValidateSource(source sources.Source) error {\n\t_, ok := source.(compatibleSource)\n\tif !ok {\n\t\treturn fmt.Errorf(\"invalid source for %q tool: source %q is not a compatible type\", t.Cfg.Type, t.Cfg.Source)\n\t}\n\treturn nil\n}\n\nfunc (t Tool) Invoke(ctx context.Context, s sources.Source, params parameters.ParamValues, accessToken tools.AccessToken) (any, util.ToolboxError) {\n\tsource, ok := s.(compatibleSource)\n\tif !ok {\n\t\treturn nil, util.NewClientServerError(\"source used is not compatible with the tool\", http.StatusInternalServerError, nil)\n\t}\n\tstoreID, err := common.ValidateAndFetchStoreID(params, source.AllowedFHIRStores())\n\tif err != nil {\n\t\treturn nil, util.NewAgentError(\"failed to validate store ID\", err)\n\t}\n\tvar tokenStr string\n\tif source.UseClientAuthorization() {\n\t\ttokenStr, err = accessToken.ParseBearerToken()\n\t\tif err != nil {\n\t\t\treturn nil, util.NewClientServerError(\"error parsing access token\", http.StatusUnauthorized, err)","sourceCodeStart":83,"sourceCodeEnd":119,"githubUrl":"https://github.com/googleapis/mcp-toolbox/blob/8cc6e09de2ad7b8bffc77751799585a1401a48eb/internal/tools/cloudhealthcare/cloudhealthcaregetfhirstoremetrics/cloudhealthcaregetfhirstoremetrics.go#L83-L119","documentation":"ValidateSource in cloudhealthcaregetfhirstoremetrics returns this error when the provided sources.Source does not implement compatibleSource. The metrics tool can only query store metrics through the Cloud Healthcare source's API helpers, so foreign source types are rejected before invocation.","triggerScenarios":"Toolset wiring or Invoke-time validation passing a source of a different engine kind to this tool.","commonSituations":"Wrong source key in tools.yaml; post-refactor source types no longer matching the interface; test stubs missing interface methods after the interface gained AllowedFHIRStores/UseClientAuthorization.","solutions":["Bind the tool to a cloudhealthcare-kind source.","Verify source initialization completed and SourceType matches.","Update mocks to implement the full compatibleSource interface.","Grep config for the tool kind and confirm its source field points at the healthcare source."],"exampleFix":"// before\n  source: bq-source\n// after\n  source: healthcare-source","handlingStrategy":"type-guard","validationCode":"if _, ok := src.(cloudhealthcare.Source); !ok {\n    return errors.New(\"metrics tool requires a cloudhealthcare source\")\n}","typeGuard":"func isCompatible(s sources.Source) bool {\n    _, ok := s.(interface {\n        UseClientAuthorization() bool\n        AllowedFHIRStores() []string\n    })\n    return ok\n}","tryCatchPattern":"if err := tool.ValidateSource(src); err != nil {\n    return fmt.Errorf(\"source incompatible with metrics tool: %w\", err)\n}","preventionTips":["Match tool kind and source kind in tools.yaml","Call ValidateSource at wiring time, not per request","Maintain full compatibleSource implementations in test fakes","Search configs for stray references to other sources"],"tags":["go","type-assertion","configuration","cloud-healthcare"],"backgroundTag":"incompatible-source-type","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"}