googleapis/mcp-toolbox · error

failed to create ResourceManager projects client for project

Error message

failed to create ResourceManager projects client for project %q: %w

What it means

The final client, the Cloud Resource Manager v3 Projects client, is created with resourcemanager.NewProjectsClient. On failure, all three Dataplex clients are closed and this wrapped error is returned. This client is needed both for GetProject during initialization and for resolving project numbers later.

Source

Thrown at internal/sources/dataplex/dataplex.go:250

	dataScanClient, err := dataplexapi.NewDataScanClient(ctx, opts...)
	if err != nil {
		client.Close()
		return nil, nil, nil, nil, fmt.Errorf("failed to create Dataplex DataScan client for project %q: %w", project, err)
	}

	dataProductClient, err := dataplexapi.NewDataProductClient(ctx, opts...)
	if err != nil {
		client.Close()
		dataScanClient.Close()
		return nil, nil, nil, nil, fmt.Errorf("failed to create Dataplex DataProduct client for project %q: %w", project, err)
	}

	projectsClient, err := resourcemanager.NewProjectsClient(ctx, opts...)
	if err != nil {
		client.Close()
		dataScanClient.Close()
		dataProductClient.Close()
		return nil, nil, nil, nil, fmt.Errorf("failed to create ResourceManager projects client for project %q: %w", project, err)
	}

	return client, dataScanClient, dataProductClient, projectsClient, nil
}

func (s *Source) LookupEntry(ctx context.Context, name string, view int, aspectTypes []string, entry string) (*dataplexpb.Entry, error) {
	viewMap := map[int]dataplexpb.EntryView{
		1: dataplexpb.EntryView_BASIC,
		2: dataplexpb.EntryView_FULL,
		3: dataplexpb.EntryView_CUSTOM,
		4: dataplexpb.EntryView_ALL,
	}
	req := &dataplexpb.LookupEntryRequest{
		Name:        name,
		View:        viewMap[view],
		AspectTypes: aspectTypes,
		Entry:       entry,
	}

View on GitHub (pinned to 8cc6e09de2)

Solutions

  1. Verify connectivity to cloudresourcemanager.googleapis.com from the host.
  2. Retry initialization — three other clients already connected, so this is likely transient.
  3. Update cloud.google.com/go/resourcemanager to the latest version.
  4. Check that no per-service endpoint overrides or VPC-SC egress rules block only the Resource Manager domain.
Defensive patterns

Strategy: retry

Validate before calling

curl -sS --max-time 5 https://cloudresourcemanager.googleapis.com/ >/dev/null && echo reachable || echo unreachable

Try / catch

src, err := cfg.Initialize(ctx, tracer)
if err != nil {
	if strings.Contains(err.Error(), "failed to create ResourceManager projects client") {
		return backoff.Retry(func() error { _, err := cfg.Initialize(ctx, tracer); return err }, backoff.NewExponentialBackOff())
	}
	return err
}

Prevention

When it happens

Trigger: initDataplexConnection calls resourcemanager.NewProjectsClient(ctx, opts...) after the three Dataplex clients succeed; failure closes all of them and aborts initialization.

Common situations: cloudresourcemanager.googleapis.com unreachable (firewall/proxy); cloud.google.com/go/resourcemanager dependency issues; transient gRPC failures; malformed options shared across all four constructors (though earlier clients succeeding makes this unlikely).

Related errors


AI-assisted analysis of googleapis/mcp-toolbox@8cc6e09de2 (2026-09-05). Data as JSON: /api/errors/a1f7f3f44bafc0c4. Report an issue: GitHub.