googleapis/mcp-toolbox · warning
failed to get metadata for created bucket %q: %w
Error message
failed to get metadata for created bucket %q: %w
What it means
The bucket was created successfully, but the follow-up BucketHandle.Attrs call to fetch its metadata failed. The resource exists; only the read-back of attributes (wrapped error: IAM, transient network, or eventual consistency) failed.
Source
Thrown at internal/sources/cloudstorage/cloudstorage.go:333
if err := s.validateBucket(bucket); err != nil {
return nil, err
}
if project == "" {
project = s.Project
}
attrs := &storage.BucketAttrs{Location: location}
if uniformBucketLevelAccess {
attrs.UniformBucketLevelAccess = storage.UniformBucketLevelAccess{Enabled: true}
}
bkt := s.client.Bucket(bucket)
if err := bkt.Create(ctx, project, attrs); err != nil {
return nil, fmt.Errorf("failed to create bucket %q in project %q: %w", bucket, project, err)
}
createdAttrs, err := bkt.Attrs(ctx)
if err != nil {
return nil, fmt.Errorf("failed to get metadata for created bucket %q: %w", bucket, err)
}
return map[string]any{
"bucket": bucket,
"created": true,
"metadata": createdAttrs,
}, nil
}
// GetBucketMetadata returns raw bucket metadata from the Cloud Storage client.
func (s *Source) GetBucketMetadata(ctx context.Context, bucket string) (*storage.BucketAttrs, error) {
if err := s.validateBucket(bucket); err != nil {
return nil, err
}
attrs, err := s.client.Bucket(bucket).Attrs(ctx)
if err != nil {
return nil, fmt.Errorf("failed to get metadata for bucket %q: %w", bucket, err)
}
return attrs, nilView on GitHub (pinned to 8cc6e09de2)
Solutions
- Retry with backoff: the bucket exists, so re-fetch metadata via a separate Attrs/GetGoogleCloudbucket call.
- Grant the service account storage.buckets.get in addition to create if using a custom role.
- Extend the context timeout so the metadata read isn't cancelled immediately after creation.
- Treat the operation as partially successful: verify with gsutil/gcloud whether the bucket exists before re-creating.
Example fix
// before
created, err := source.CreateBucket(ctx, name, proj, nil, "US", "STANDARD", true) // attrs read failed
// after (recover)
if err != nil {
time.Sleep(500 * time.Millisecond)
created, err = source.CreateBucket(ctx, name, proj, nil, "US", "STANDARD", true) // or re-fetch attrs
} Defensive patterns
Strategy: retry
Try / catch
for attempt := 0; attempt < 3; attempt++ {
res, err := source.CreateBucket(ctx, name, proj, nil, loc, class, ula)
if err == nil { break }
time.Sleep(time.Duration(1<<attempt) * 200 * time.Millisecond) // bucket already exists; retry gets metadata
} Prevention
- Retry the operation with backoff - the bucket exists and re-running is safe until metadata reads succeed.
- Give the service account storage.buckets.get alongside create.
- Use a context timeout long enough to cover create + metadata read.
- Log this as a partial success and reconcile via a metadata check before recreating.
When it happens
Trigger: CreateBucket succeeded, then bkt.Attrs(ctx) failed immediately after: transient 5xx/network blip, context cancelled, or the caller lacking storage.buckets.get despite having create rights, or replication lag on fresh buckets.
Common situations: Short client timeouts firing right after the create RPC; service accounts with create-but-not-get IAM splits (unusual custom roles); reading metadata of a bucket created milliseconds earlier.
Related errors
- failed to create bucket %q in project %q: %w
- failed to list objects in bucket %q: %w
- failed to open object %q in bucket %q: %w
- object %q: %d bytes exceeds %d byte limit: %w
- failed to read object %q in bucket %q: %w
AI-assisted analysis of googleapis/mcp-toolbox@8cc6e09de2 (2026-09-05).
Data as JSON: /api/errors/f53e8d44b16879df.
Report an issue: GitHub.