Skip to main content
skill CX Codex

r2-upload — Claude Code skill: file uploads and setup

Uploads files to Cloudflare R2, AWS S3, and compatible storage, then returns a temporary download link. Use it when a file needs to be shared with an expiration time.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add zebbern/claude-code-guide --skill r2-upload -a claude-code
Open on GitHub

What r2-upload does

The skill sends a file to a selected bucket and returns a signed download URL with a configurable lifetime. You can choose the bucket, storage key, and expiration; by default, the original filename is kept, with a UUID prefix added to reduce name collisions. Content type is inferred from the file extension.

The included tools are r2_upload, r2_list, and r2_delete for uploading, viewing recent uploads, and deleting a file. Configuration lives in ~/.r2-upload.yml, or its location can be set with R2_UPLOAD_CONFIG. You need the bucket endpoint, an access key, and a secret key; uploads cannot run without those credentials. The sample Cloudflare R2 configuration uses region auto.

What it helps with

  • upload a file to an R2 or S3 bucket
  • create an expiring download link
  • store a file under a chosen key
  • view recent uploads
  • remove a file from storage

Example prompts for the agent

  • Upload report.pdf to the bucket and return a temporary download link.
  • Send build.zip to the personal bucket and store it as releases/build.zip.
  • Show recent uploads, then delete old-backup.zip.

How to install r2-upload

1Skills CLI (Vercel)

npx skills add zebbern/claude-code-guide --skill r2-upload -a claude-code

2Manually: put the files in place

~/.claude/skills/r2-upload/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/r2-upload/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about r2-upload

How do I install r2-upload in Claude Code?

Run npx skills add zebbern/claude-code-guide --skill r2-upload -a claude-code, then use ~/.claude/skills/r2-upload/SKILL.md.

What does r2-upload do?

It uploads files to R2, S3, or compatible storage and creates signed download links with a configurable expiration.

What configuration does r2-upload need?

Create ~/.r2-upload.yml with the endpoint, access key, secret key, and bucket name. One config can contain multiple bucket settings.

Source text

SKILL.md · MIT
---
name: r2-upload
description: "Upload files to Cloudflare R2, AWS S3, or any S3-compatible storage (like MinIO) and generate secure, time-limited presigned download links with configurable expiration, typically set to 5 minutes. Use when the user needs to upload a file to cloud storage and get a shareable link, or mentions R2, S3, presigned URLs, temporary links, or file uploads with expiration."
summary: TypeScript-based MCP skill for uploading files to cloud storage (R2, S3, MinIO) with secure, temporary download links. Features multi-bucket support, interactive onboarding, and 5-minute default expiration.
---

# Send Me My Files - R2 Upload with Short Lived Signed URLs

Upload files to Cloudflare R2 or any S3-compatible storage and generate presigned download links.

## Features

- Upload files to R2/S3 buckets
- Generate presigned download URLs (configurable expiration)
- Support for any S3-compatible storage (R2, AWS S3, MinIO, etc.)
- Multiple bucket configurations
- Automatic content-type detection

## Configuration

Create `~/.r2-upload.yml` (or set `R2_UPLOAD_CONFIG` env var):

```yaml
# Default bucket (used when no bucket specified)
default: my-bucket

# Bucket configurations
buckets:
  my-bucket:
    endpoint: https://abc123.r2.cloudflarestorage.com
    access_key_id: your_access_key
    secret_access_key: your_secret_key
    bucket_name: my-bucket
    public_url: https://files.example.com  # Optional: custom domain
    region: auto  # For R2, use "auto"

  # Additional buckets
  personal:
    endpoint: https://xyz789.r2.cloudflarestorage.com
    access_key_id: ...
    secret_access_key: ...
    bucket_name: personal-files
    region: auto
```

### Cloudflare R2 Setup

1. Go to Cloudflare Dashboard → R2
2. Create a bucket
3. Go to R2 API Tokens: `https://dash.cloudflare.com/<ACCOUNT_ID>/r2/api-tokens`
4. Create a new API token
   - **Important:** Apply to specific bucket (select your bucket)
   - Permissions: Object Read & Write
5. Copy the Access Key ID and Secret Access Key
6. Use endpoint format: `https://<account_id>.r2.cloudflarestorage.com`
7. Set `region: auto`

### AWS S3 Setup

```yaml
aws-bucket:
  endpoint: https://s3.us-east-1.amazonaws.com
  access_key_id: ...
  secret_access_key: ...
  bucket_name: my-aws-bucket
  region: us-east-1
```

## Usage

### Upload a file

```bash
r2-upload /path/to/file.pdf
# Returns: https://files.example.com/abc123/file.pdf?signature=...
```

### Upload with custom path

```bash
r2-upload /path/to/file.pdf --key uploads/2026/file.pdf
```

### Upload to specific bucket

```bash
r2-upload /path/to/file.pdf --bucket personal
```

### Custom expiration (default: 5 minutes)

```bash
r2-upload /path/to/file.pdf --expires 24h
r2-upload /path/to/file.pdf --expires 1d
r2-upload /path/to/file.pdf --expires 300  # seconds
```

### Public URL (no signature)

```bash
r2-upload /path/to/file.pdf --public
```

## Tools

- `r2_upload` - Upload file and get presigned URL
- `r2_list` - List recent uploads
- `r2_delete` - Delete a file

## Environment Variables

- `R2_UPLOAD_CONFIG` - Path to config file (default: `~/.r2-upload.yml`)
- `R2_DEFAULT_BUCKET` - Override default bucket
- `R2_DEFAULT_EXPIRES` - Default expiration in seconds (default: 300 = 5 minutes)

## Notes

- Uploaded files are stored with their original filename unless `--key` is specified
- Automatic UUID prefix added to prevent collisions (e.g., `abc123/file.pdf`)
- Content-Type automatically detected from file extension
- Presigned URLs expire after the configured duration

© zebbern · MIT · zebbern/claude-code-guide

Similar skills

All skills for Cloud: AWS, Azure, GCP →

From the same set24

secure-code-review This skill walks your code through all ten OWASP Top 10 categories and returns a report with vulnerable examples and working fixes. Useful before a release or when reviewing unfamiliar code. CX Codex +1 ★ 4,679repo stars scanning-tools Guidance for choosing and using tools to inspect networks, web apps, and systems for security issues. Useful when planning a scan or preparing its report. CX Codex +1 ★ 4,679repo stars route-to-openapi Reads route definitions in your source tree and writes an OpenAPI 3.0.3 spec. Useful when an API needs docs and nobody wants to type them out. CX Codex +1 ★ 4,679repo stars regression-modeler Fits OLS or logistic regression on your table and explains the coefficients in plain language. Handy when you need significance checks without writing the stats code yourself. CX Codex +1 ★ 4,679repo stars project-sizing-guide Produces effort estimates with PERT, T-shirt sizing or Function Point Analysis. Useful when someone asks how long a feature will take. CX Codex +1 ★ 4,679repo stars playwright-skill Guides an agent through Playwright test design, from locator choices to debugging and CI setup. Useful for E2E, API, and component checks. CX Codex +1 ★ 4,679repo stars pipeline-blueprint The skill hands you CI/CD pipeline templates for GitHub Actions and GitLab CI, picked by project type. Useful when you're setting up CI or cleaning up a pipeline that grew messy. CX Codex +1 ★ 4,679repo stars nextjs-developer Build Next.js 14+ apps with App Router using guidance for server components, data fetching, SEO, and deployment preparation. CX Codex +1 ★ 4,679repo stars

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor