googleapis/mcp-toolbox · error

error getting AlloyDB user

Error message

error getting AlloyDB user: %w

What it means

This error wraps a failure from the AlloyDB Admin API Users.Get call, which retrieves a specific user under a cluster via projects/*/locations/*/clusters/*/users/*. It is thrown when the REST GET returns an HTTP error or fails at the transport level. The wrapped error preserves status code and message for the caller.

Solutions

  1. Verify the user exists (ListUsers) and the exact user ID/email is used
  2. Check project/location/cluster path components are correct
  3. Refresh the access token and confirm it has alloydb scope
  4. Use errors.As(*googleapi.Error) to distinguish 404 (missing user) from 403 (permission) errors
  5. Retry only transient 5xx errors; 404 means the user does not exist

Example fix

// before
resp, err := service.Projects.Locations.Clusters.Users.Get(urlString).Do()
if err != nil { return nil, fmt.Errorf("error getting AlloyDB user: %w", err) }
// after
resp, err := service.Projects.Locations.Clusters.Users.Get(urlString).Do()
if err != nil {
    var gerr *googleapi.Error
    if errors.As(err, &gerr) && gerr.Code == 404 {
        return nil, fmt.Errorf("user %s not found in cluster %s: %w", user, cluster, err)
    }
    return nil, fmt.Errorf("error getting AlloyDB user: %w", err)
}
Defensive patterns

Strategy: try-catch

Validate before calling

// Go: verify cluster exists and user name supplied before GetUsers
if user == "" {
    return fmt.Errorf("user name is required")
}
if _, err := s.GetCluster(ctx, project, location, cluster, accessToken); err != nil {
    return fmt.Errorf("cluster %s not found: %w", cluster, err)
}

Type guard

func IsNotFound(err error) bool {
    var gerr *googleapi.Error
    return errors.As(err, &gerr) && gerr.Code == 404
}

Try / catch

u, err := s.GetUsers(ctx, project, location, cluster, userName, accessToken)
if err != nil {
    var gerr *googleapi.Error
    if errors.As(err, &gerr) && gerr.Code == 404 {
        return nil, fmt.Errorf("user %q not found in cluster %q", userName, cluster)
    }
    return nil, err
}

Prevention

When it happens

Trigger: Calling Source.GetUsers with a user name that does not exist in the cluster, a malformed resource path, an unauthorized/expired access token, or transient network failure during Users.Get(urlString).Do().

Common situations: Listing users after a user was deleted, IAM vs built-in user naming confusion (e.g., service account emails), wrong cluster path components, and token scope problems.

Related errors


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

Appendix: source

Thrown at internal/sources/alloydbadmin/alloydbadmin.go:277

	resp, err := service.Projects.Locations.Clusters.Instances.Get(urlString).Do()
	if err != nil {
		return nil, fmt.Errorf("error getting AlloyDB instance: %w", err)
	}
	return resp, nil
}

func (s *Source) GetUsers(ctx context.Context, project, location, cluster, user, accessToken string) (any, error) {
	service, err := s.getService(ctx, accessToken)
	if err != nil {
		return nil, err
	}

	urlString := fmt.Sprintf("projects/%s/locations/%s/clusters/%s/users/%s", project, location, cluster, user)

	resp, err := service.Projects.Locations.Clusters.Users.Get(urlString).Do()
	if err != nil {
		return nil, fmt.Errorf("error getting AlloyDB user: %w", err)
	}
	return resp, nil
}

func (s *Source) ListCluster(ctx context.Context, project, location, accessToken string) (any, error) {
	service, err := s.getService(ctx, accessToken)
	if err != nil {
		return nil, err
	}

	urlString := fmt.Sprintf("projects/%s/locations/%s", project, location)

	resp, err := service.Projects.Locations.Clusters.List(urlString).Do()
	if err != nil {
		return nil, fmt.Errorf("error listing AlloyDB clusters: %w", err)
	}
	return resp, nil
}

View on GitHub (pinned to 8cc6e09de2)