First-party app
Google Cloud Storage

Google Cloud Storage

Google Cloud Storage: buckets and objects, uploads and downloads, lifecycle and access — plus V4 signed URLs minted offline from the service-account key.

stable StorageDevOps & Infrastructure

About

Google Cloud Storage ships in the w6w first-party pack. It declares 16 actions, 2 health checks, and the host runs its code in a sandbox that never sees the credential.

App id
io.w6w.gcs
Version
0.1.1
Author
w6w
Licence
MIT
Categories
Storage · DevOps & Infrastructure

Overview

Google Cloud Storage is where an application keeps files at any scale, and this app covers the everyday shape of that: create and configure buckets, and upload, list, update, copy, and delete the objects inside them, with lifecycle rules and access settings included.

The standout capability is signing a URL that lets someone with no Google account fetch or upload a single object over ordinary HTTPS for a limited time — the reason to reach for this app rather than routing a file’s bytes through a workflow itself. New buckets default to a locked-down configuration rather than Google’s own more permissive defaults, on the reasoning that a bucket an automation creates is one nobody manually reviewed. Every write can be made conditional on the object’s current state, so two workflows racing to update the same file don’t silently clobber each other.

Restoring a deleted object, composing several objects into one server-side, and reading a bucket’s access policy round out the set — covering the operations a workflow doing real file management actually needs, short of the bucket and object administration that belongs in the Cloud Console.

Build with Google Cloud Storage

Three routes to the same 16 actions. The Workflow tab is generated from Google Cloud Storage's own manifest and carries its real ids, so it is copy-pasteable; the Code and CLI examples are the same call for any action on any app, so every app-specific value in them is a blank you fill in.

Create a bucket

bucket-create

Create a bucket. The name is unique across ALL of Google Cloud, the location is permanent, and a cold storage class bills a minimum duration per object — which can cost more than STANDARD for anything short-lived.

Delete a bucket

bucket-delete

Remove an empty bucket. 'Empty' includes non-current VERSIONS and SOFT-DELETED objects, which an ordinary listing does not show — the usual reason a delete keeps failing.

Get a bucket

bucket-get

One bucket's configuration: storage class and its minimum billed duration, whether per-object ACLs exist at all, whether it can be made public, and what happens to overwrites.

Get a bucket's IAM policy

bucket-iam-get

Who can reach this bucket. Flags `allUsers` AND `allAuthenticatedUsers` — the second sounds narrower and means anybody with a Google account. Project-level roles apply too and are NOT in this response.

List buckets

bucket-list

The buckets in a project. An EMPTY result is usually a missing IAM role rather than an empty project — listing succeeds and shows nothing.

Update a bucket

bucket-update

Change versioning, storage class, access settings or lifecycle rules. Lifecycle rules REPLACE the whole set rather than merging, and uniform access can only be turned off within 90 days of turning it on.

Compose objects

object-compose

Concatenate up to 32 objects into one, server-side — the only way to append in a store whose objects are immutable. The result has a CRC32C but NO MD5.

Copy or move an object

object-copy

Copy an object, optionally deleting the source — which is what a rename or a move is here, because there is no move. A large copy can return unfinished, with a token to continue it.

Delete an object

object-delete

Remove an object. Whether that is reversible depends entirely on the bucket's versioning and soft-delete settings — this reads them and says which case you are in.

Download an object

object-download

Read an object's contents as text — configuration and small data, not files. `alt=media` is what separates the CONTENTS from the metadata JSON. For anything large, hand out a signed URL instead of moving the bytes through here.

Get object metadata

object-get

One object's metadata. `generation` is what makes a safe overwrite possible; `md5Hash` is BASE64 not hex, and a composed object has none at all.

List objects

object-list

List a bucket's objects. With a delimiter, subfolders come back in a SEPARATE `prefixes` array — reading only `items` shows an empty folder while everything sits one level deeper.

Restore a deleted object

object-restore

Bring back a soft-deleted object, or a previous version. The GENERATION is required — `object-list` with `softDeleted` or `versions` on is where it comes from. The restored copy becomes a new current version rather than replacing anything.

Create a signed URL

object-signed-url

Mint a time-limited URL for one object, so a recipient with no Google credentials can fetch or upload it directly. It CANNOT BE REVOKED before it expires, so the lifetime is the only control. Signing needs Service Account Token Creator, which no Cloud Storage role grants.

Update object metadata

object-update

Change content type, cache control, custom metadata or storage class. Custom metadata REPLACES the whole map rather than merging, and a colder storage class restarts its minimum billed duration.

Upload an object

object-upload

Write an object from text. This OVERWRITES an existing name and returns 200 — turn on `ifNotExists`, or pass a generation, to make a conflicting write fail with a 412 instead.

A workflow step names the app and the action, and the editor fills in the connection when you pick one. This is the Step shape from the workflow spec, carrying Google Cloud Storage's real ids.

{
  "manifestVersion": "2",
  "name": "gcs-example",
  "steps": [
    {
      "id": "bucket-create",
      "uses": {
        "app": "io.w6w.gcs",
        "action": "bucket-create",
        "connection": "conn_YOUR_CONNECTION_ID"
      },
      "with": {
        "project": "<project>",
        "name": "<name>",
        "location": "<location>"
      }
    }
  ]
}

Here are some of the things you can do

  • Create a bucket

    perform
    bucket-create
  • Get a bucket

    read
    bucket-get
  • Get a bucket's IAM policy

    read
    bucket-iam-get
  • List buckets

    search
    bucket-list
  • Update a bucket

    perform
    bucket-update

+11 more actions available

Every app-specific value here is a blank you have to fill in. An app action is reached through the connection that authenticates it, so the address is a connection id, not the app id — and connections belong to your account, so a public page cannot know yours. Create one for Google Cloud Storage, then fill in the three blanks: conn_YOUR_CONNECTION_ID, the action key, and the parameters that action declares. The call itself is real — the shape is transcribed from the studio's own snippet builder, which prints the same kind of blanks — but nothing in it is specific to Google Cloud Storage. The Workflow tab is where this app's real ids are.

Install
npm install @w6w/sdk
yarn add @w6w/sdk
pnpm add @w6w/sdk
deno add npm:@w6w/sdk
Code
import { W6wClient, isActionRun } from "@w6w/sdk";

// Reads W6W_BASE_URL and W6W_TOKEN from the environment when omitted.
const client = new W6wClient();

const envelope = await client.run({
  urn: "conn_YOUR_CONNECTION_ID",
  action: "bucket-create",
  payload: {
    project: "<value>",
    name: "<value>",
    location: "<value>",
    // storageClass: "<value>",
    // uniformAccess: "<value>",
    // versioning: "<value>",
    // publicAccessPrevention: "<value>",
    // lifecycle: "<value>",
    // labels: "<value>",
  },
});

if (isActionRun(envelope)) console.log(envelope.value);
Install the CLI
npm install -g @w6w/cli
CLI
w6w run conn_YOUR_CONNECTION_ID --action bucket-create --payload '{"project":"<value>","name":"<value>","location":"<value>"}'

Give an AI agent Google Cloud Storage — without giving it Google Cloud Storage's credentials. One MCP endpoint exposes every app, function and workflow the caller is entitled to, as tools it can discover and run. Access is granted per team while we onboard.

One tool call
{
  "name": "w6w_invoke",
  "arguments": {
    "ref": "app:io.w6w.gcs#bucket-create",
    "input": {
      "project": "<project>",
      "name": "<name>",
      "location": "<location>"
    }
  }
}

Every tool names its target with a single ref. The app: form above doesn't name a connection at all — the host resolves which of the caller's Google Cloud Storage connections to sign with, and refuses rather than guesses when the answer is ambiguous.

What the agent gets

Credentials it can't read

The token is attached host-side, at the moment of the call. It is never a tool argument, never in the model's context, and never in a transcript — so a prompt injection has nothing to exfiltrate.

A tool surface scoped to the caller

Tools are derived per end user from what that person has actually connected and is entitled to — not one shared bot identity carrying the union of everyone's access.

A durable workflow in one call

Multi-step work runs on the workflow engine and returns a run handle the agent can poll — retries, branching and state survive the conversation that started them.

Health-aware discovery

Google Cloud Storage's declared health checks are on the surface too, so an agent can tell "the vendor is down" from "your credential expired" before it burns a retry on either.

The MCP surface is part of the hosted platform. Google Cloud Storage itself is MIT, and the runtime that executes it is source-available (FSL).

Request MCP access

Health checks

Google Cloud Storage declares its own checks, so its health is a property of the app rather than something the host guesses at.

service

Cloud Storage status

Reads Google Cloud's incident feed for OPEN incidents affecting Cloud Storage by product id. The feed is an archive of recent incidents — most entries are already closed — and a multi-product outage is filed under 'Multiple Products', so matching on the name misses exactly the large ones.

quota

Rate-limit headroom

Not checkable. Cloud Storage publishes no rate-limit header, and its real constraint is per-OBJECT — about one write per second to a single name, however many clients — which no account-level number would describe.