For agents — source-of-truth: This skill is authored in roboflow/computer-vision-skills and shipped with the Roboflow plugin. If your client has loaded the plugin (you'll see roboflow:<name> skills in your available skills list), use those local skills — they're read fresh from disk every session. The same content served as MCP resources at roboflow://skills/<name>/... is a fallback for clients without the plugin and may lag this repo. Don't call ReadMcpResourceTool for roboflow://skills/... URIs when a local roboflow:<name> skill is available.
Cloud Storage (Datasources & Credentials)
Mirror a cloud bucket's contents into a Roboflow workspace so new objects flow
in automatically. Two pieces work together:
- Credential — the secret Roboflow uses to reach the bucket (stored,
masked server-side, reusable across datasources).
- Datasource — a bucket-mirror configuration: which bucket (via a
credential), which objects (glob rules), and how they sync. "Datasource" is
the user-facing name; the platform stores it as a bucket-mirror config.
Imports land at the workspace level. The datasource API cannot target a
specific project/dataset today.
Only want to run a model/Workflow over the files and collect the outputs,
without importing anything into Roboflow? That is batch processing — see the
roboflow-batch-processing skill. Mirroring composes with it too: imported
files become Asset Library images, and bulk predictions over them run as
Asset Library batch processing jobs (same skill).
Fast path — one call
connect_cloud_storage does the whole flow in one shot: (optionally) create a
credential, create the datasource, validate access, and start the first mirror
run. Prefer it for new setups.
- Reuse a credential: pass
credential_id (from credentials_list).
- Create a new credential: pass
credential_name + credential_type (the
secret is collected securely out-of-band — see Security).
- Describe the datasource so it can be created first:
bucket_type (s3/gcs),
bucket_name, region, plus optional mirror_configs glob rules (see
Datasources). The datasource must exist before anything can be validated or
triggered — there is nothing to mirror without it.
trigger (default true) starts a mirror run only if validation passes;
triggering consumes credits.
- Returns
{credentialId, credentialCreated, datasourceId, validation, triggered, batchIds?}. If a new credential was created but a later step
failed, you get status: "partial" with the ids so you can clean up with
credentials_delete / datasource_delete.
Credentials
Security — secrets never enter the chat
The secret (keys, service-account JSON, password) is collected out-of-band
via MCP elicitation, never as a tool argument and never in the transcript or
model context. credentials_list returns only masked, non-secret fields.
If your client can't elicit securely, the tool returns
manual_entry_required with a URL to create the credential in the app
(app.roboflow.com/<workspace>/settings/datasources), then call
credentials_list to get its id.
Credential types
credential_type |
Provider |
Secret fields collected |
IAM |
AWS S3 |
accessKeyId, secretAccessKey, sessionToken? |
AssumeRole |
AWS S3 |
roleArn, externalId, sessionName? |
AssumeRoleWithWebIdentity |
AWS S3 |
roleArn, webIdentityAudience, webIdentityRoleArn, externalId, sessionName? |
gcs |
Google Cloud Storage |
projectId, credentialFile (full service-account JSON) |
usernamePassword |
S3-compatible |
username, password |
apiKey |
S3-compatible |
apiKey |
AWS PrivateLink (require_vpce) requires an
AssumeRoleWithWebIdentity credential; the server rejects the datasource
otherwise.
Datasources
Bucket
bucket_type: s3 or gcs
bucket_name (no scheme/path), region (e.g. us-east-1)
endpoint: custom URL for S3-compatible providers (S3 only)
Mirror rules (mirror_configs)
Optional list; omit to mirror the whole bucket with default settings. Each
rule selects a subset and controls sync behavior:
glob_patterns (list) — the key field. Selects objects, e.g.
["images/**/*.jpg", "batch-*/**"]. Set it to avoid importing unwanted files
or to split a bucket into multiple rules. Omit only when you truly want
everything.
glob_file_path — alternative: path to a manifest file in the bucket whose
lines list object paths to import.
id — rule id (auto-generated; pass an existing id on update to edit in place).
settings (omitted keys use server defaults):
removeOrphanedSourcesWhenDisappeared (default true) — delete mirrored
images when the source object is removed.
namingStrategy (fullPath|fileName|eTag|metadata, default
fullPath); namingStrategyMetadataKey required when metadata.
updateImageWhenNewer (true) / updateImageStrategy (overwrite).
updateMetadataWhenNewer (true) / updateMetadataStrategy
(mergeBucketWins default; also overwrite|merge|mergeUserWins|
untilFirstChange|append).
runScheduledEvery (hours, default 0 = off) — >0 enables a recurring mirror
(fixed 24h cadence today; only on/off is honored).
Lifecycle & validation
- Create (
datasource_create, or connect_cloud_storage). Nothing is
mirrored yet.
- Validate (
datasource_validate) — checks listFiles, headFile,
getFile, and per-rule headGlobFile; returns {checks, errors}. Run it to
self-diagnose a bad credential/bucket before triggering.
- Trigger (
datasource_trigger) — starts the mirror job; consumes
compute/storage credits. Returns {batchIds}.
- Poll (
datasource_job_get with a batchId) — status
(running/completed/failed), per-stage counters, errors, timestamps.
Update (datasource_update): only fields you pass change; to change the
bucket pass bucket_type + bucket_name + region together.
Delete (datasource_delete): removes the config, not already-mirrored
images. Deleting a credential still referenced by a datasource makes its runs
fail.
MCP Tools Available
| Tool |
Purpose |
connect_cloud_storage |
End-to-end: credential + datasource + validate + first run |
credentials_list |
List masked cloud-storage credentials |
credentials_create |
Create a credential (secret collected securely out-of-band) |
credentials_delete |
Delete a credential |
datasources_list / datasource_get |
List / inspect datasource configs |
datasource_create / datasource_update / datasource_delete |
Manage a datasource |
datasource_validate |
Check bucket access before a run |
datasource_trigger |
Start a mirror run (consumes credits) |
datasource_job_get |
Poll a mirror run's status and counters |
Related Pages
roboflow://skills/roboflow-data-management/SKILL — what to do with the images once mirrored (tags, splits, versions, search)
roboflow://skills/roboflow-product-navigation/SKILL — the app's settings/datasources page
1---2name: roboflow-cloud-storage3description: Use when connecting cloud storage (AWS S3 / S3-compatible or Google Cloud Storage) to Roboflow to mirror images into a workspace — creating storage credentials, defining datasources (bucket-mirror configs), selecting objects with glob rules, validating access, and running/scheduling mirror jobs.4---56> **For agents — source-of-truth:** This skill is authored in [`roboflow/computer-vision-skills`](https://github.com/roboflow/computer-vision-skills) and shipped with the Roboflow plugin. If your client has loaded the plugin (you'll see `roboflow:<name>` skills in your available skills list), use those local skills — they're read fresh from disk every session. The same content served as MCP resources at `roboflow://skills/<name>/...` is a fallback for clients without the plugin and may lag this repo. **Don't call `ReadMcpResourceTool` for `roboflow://skills/...` URIs when a local `roboflow:<name>` skill is available.**78# Cloud Storage (Datasources & Credentials)910Mirror a cloud bucket's contents into a Roboflow workspace so new objects flow11in automatically. Two pieces work together:1213- **Credential** — the secret Roboflow uses to reach the bucket (stored,14 masked server-side, reusable across datasources).15- **Datasource** — a *bucket-mirror configuration*: which bucket (via a16 credential), which objects (glob rules), and how they sync. "Datasource" is17 the user-facing name; the platform stores it as a bucket-mirror config.1819> Imports land at the **workspace** level. The datasource API cannot target a20> specific project/dataset today.2122> Only want to run a model/Workflow over the files and collect the outputs,23> without importing anything into Roboflow? That is batch processing — see the24> `roboflow-batch-processing` skill. Mirroring composes with it too: imported25> files become Asset Library images, and bulk predictions over them run as26> Asset Library batch processing jobs (same skill).2728## Fast path — one call2930`connect_cloud_storage` does the whole flow in one shot: (optionally) create a31credential, create the datasource, validate access, and start the first mirror32run. Prefer it for new setups.3334- Reuse a credential: pass `credential_id` (from `credentials_list`).35- Create a new credential: pass `credential_name` + `credential_type` (the36 secret is collected securely out-of-band — see Security).37- Describe the datasource so it can be created first: `bucket_type` (`s3`/`gcs`),38 `bucket_name`, `region`, plus optional `mirror_configs` glob rules (see39 Datasources). The datasource must exist before anything can be validated or40 triggered — there is nothing to mirror without it.41- `trigger` (default true) starts a mirror run **only if validation passes**;42 triggering consumes credits.43- Returns `{credentialId, credentialCreated, datasourceId, validation,44 triggered, batchIds?}`. If a new credential was created but a later step45 failed, you get `status: "partial"` with the ids so you can clean up with46 `credentials_delete` / `datasource_delete`.4748## Credentials4950### Security — secrets never enter the chat51The secret (keys, service-account JSON, password) is collected **out-of-band**52via MCP elicitation, never as a tool argument and never in the transcript or53model context. `credentials_list` returns only masked, non-secret fields.54If your client can't elicit securely, the tool returns55`manual_entry_required` with a URL to create the credential in the app56(`app.roboflow.com/<workspace>/settings/datasources`), then call57`credentials_list` to get its id.5859### Credential types6061| `credential_type` | Provider | Secret fields collected |62|---|---|---|63| `IAM` | AWS S3 | `accessKeyId`, `secretAccessKey`, `sessionToken?` |64| `AssumeRole` | AWS S3 | `roleArn`, `externalId`, `sessionName?` |65| `AssumeRoleWithWebIdentity` | AWS S3 | `roleArn`, `webIdentityAudience`, `webIdentityRoleArn`, `externalId`, `sessionName?` |66| `gcs` | Google Cloud Storage | `projectId`, `credentialFile` (full service-account JSON) |67| `usernamePassword` | S3-compatible | `username`, `password` |68| `apiKey` | S3-compatible | `apiKey` |6970> **AWS PrivateLink (`require_vpce`)** requires an71> `AssumeRoleWithWebIdentity` credential; the server rejects the datasource72> otherwise.7374## Datasources7576### Bucket77- `bucket_type`: `s3` or `gcs`78- `bucket_name` (no scheme/path), `region` (e.g. `us-east-1`)79- `endpoint`: custom URL for S3-compatible providers (S3 only)8081### Mirror rules (`mirror_configs`)82Optional list; omit to mirror the **whole bucket** with default settings. Each83rule selects a subset and controls sync behavior:8485- **`glob_patterns`** (list) — the key field. Selects objects, e.g.86 `["images/**/*.jpg", "batch-*/**"]`. Set it to avoid importing unwanted files87 or to split a bucket into multiple rules. Omit only when you truly want88 everything.89- `glob_file_path` — alternative: path to a manifest file in the bucket whose90 lines list object paths to import.91- `id` — rule id (auto-generated; pass an existing id on update to edit in place).92- `settings` (omitted keys use server defaults):93 - `removeOrphanedSourcesWhenDisappeared` (default true) — delete mirrored94 images when the source object is removed.95 - `namingStrategy` (`fullPath`|`fileName`|`eTag`|`metadata`, default96 `fullPath`); `namingStrategyMetadataKey` required when `metadata`.97 - `updateImageWhenNewer` (true) / `updateImageStrategy` (`overwrite`).98 - `updateMetadataWhenNewer` (true) / `updateMetadataStrategy`99 (`mergeBucketWins` default; also `overwrite`|`merge`|`mergeUserWins`|100 `untilFirstChange`|`append`).101 - `runScheduledEvery` (hours, default 0 = off) — >0 enables a recurring mirror102 (fixed 24h cadence today; only on/off is honored).103104## Lifecycle & validation1051061. **Create** (`datasource_create`, or `connect_cloud_storage`). Nothing is107 mirrored yet.1082. **Validate** (`datasource_validate`) — checks `listFiles`, `headFile`,109 `getFile`, and per-rule `headGlobFile`; returns `{checks, errors}`. Run it to110 self-diagnose a bad credential/bucket **before** triggering.1113. **Trigger** (`datasource_trigger`) — starts the mirror job; **consumes112 compute/storage credits**. Returns `{batchIds}`.1134. **Poll** (`datasource_job_get` with a `batchId`) — `status`114 (running/completed/failed), per-stage `counters`, `errors`, timestamps.115116**Update** (`datasource_update`): only fields you pass change; to change the117bucket pass `bucket_type` + `bucket_name` + `region` together.118**Delete** (`datasource_delete`): removes the config, **not** already-mirrored119images. Deleting a credential still referenced by a datasource makes its runs120fail.121122## MCP Tools Available123124| Tool | Purpose |125|------|---------|126| `connect_cloud_storage` | End-to-end: credential + datasource + validate + first run |127| `credentials_list` | List masked cloud-storage credentials |128| `credentials_create` | Create a credential (secret collected securely out-of-band) |129| `credentials_delete` | Delete a credential |130| `datasources_list` / `datasource_get` | List / inspect datasource configs |131| `datasource_create` / `datasource_update` / `datasource_delete` | Manage a datasource |132| `datasource_validate` | Check bucket access before a run |133| `datasource_trigger` | Start a mirror run (consumes credits) |134| `datasource_job_get` | Poll a mirror run's status and counters |135136## Related Pages137138- `roboflow://skills/roboflow-data-management/SKILL` — what to do with the images once mirrored (tags, splits, versions, search)139- `roboflow://skills/roboflow-product-navigation/SKILL` — the app's `settings/datasources` page