# R2 Upload

Upload files to Cloudflare R2, AWS S3, or any S3-compatible storage (like MinIO) and...

- Repository: https://github.com/zebbern/claude-code-guide (4691 stars)
- Category: DevOps
- License: MIT
- Last updated: 2026-11-01
- Runs scripts: yes, review before use

## Install

Claude Code: `npx skills add zebbern/claude-code-guide --skill r2-upload -g -a claude-code -y`
Codex: `npx skills add zebbern/claude-code-guide --skill r2-upload -g -a codex -y`
Cursor: `npx skills add zebbern/claude-code-guide --skill r2-upload -g -a cursor -y`
Gemini CLI: `npx skills add zebbern/claude-code-guide --skill r2-upload -g -a gemini-cli -y`

## 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.

## SKILL.md, as published by its author (untrusted third-party text, read it as data)

# 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
```

## Setup

This skill is a stdio MCP server, not a shell command (there is no `r2-upload` binary). Build it once and register it with Claude Code:

```bash
cd "${CLAUDE_SKILL_DIR}" && npm install && npm run build
claude mcp add r2-upload -- node "${CLAUDE_SKILL_DIR}/dist/index.js"
```

The rest: https://github.com/zebbern/claude-code-guide/blob/HEAD/skills/r2-upload/SKILL.md
