This gives Claude the ability to interact with MinIO's S3-compatible object storage through the mc command line client. You get standard bucket operations like upload, download, and listing, plus some genuinely useful stuff like pre-signed URL generation for temporary file sharing and mirror commands for continuous directory syncing. The skill covers the mc tool primarily but also shows fallback methods using curl with AWS signature authentication and the AWS CLI, which is smart since MinIO is fully S3-compatible. Most helpful for self-hosted storage scenarios where you need Claude to manage files without exposing credentials directly, especially the pre-signed URL workflow.
npx -y skills add vm0-ai/vm0-skills --skill minio --agent claude-codeInstalls into .claude/skills of the current project.
mc ls myminio
mc mb myminio/my-bucket
# Upload single file
mc cp /path/to/file.txt myminio/my-bucket/
# Upload with custom name
mc cp /path/to/file.txt myminio/my-bucket/custom-name.txt
# Upload directory recursively
mc cp --recursive /path/to/folder/ myminio/my-bucket/folder/
# Download single file
mc cp myminio/my-bucket/file.txt /local/path/
# Download entire bucket
mc cp --recursive myminio/my-bucket/ /local/path/
# List all objects
mc ls myminio/my-bucket
# List recursively with details
mc ls --recursive --summarize myminio/my-bucket
# Delete single file
mc rm myminio/my-bucket/file.txt
# Delete all objects in bucket
mc rm --recursive --force myminio/my-bucket/
# Delete bucket (must be empty)
mc rb myminio/my-bucket
Create temporary shareable links:
# Download URL (expires in 7 days by default)
mc share download myminio/my-bucket/file.txt
# Download URL with custom expiry (max 7 days)
mc share download --expire 2h myminio/my-bucket/file.txt
# Upload URL (for external uploads)
mc share upload myminio/my-bucket/uploads/
# One-way sync local to remote
mc mirror /local/folder/ myminio/my-bucket/folder/
# One-way sync remote to local
mc mirror myminio/my-bucket/folder/ /local/folder/
# Watch and sync changes continuously
mc mirror --watch /local/folder/ myminio/my-bucket/folder/
# Get file metadata
mc stat myminio/my-bucket/file.txt
# Get bucket info
mc stat myminio/my-bucket
# Find by name pattern
mc find myminio/my-bucket --name "*.txt"
# Find files larger than 10MB
mc find myminio/my-bucket --larger 10MB
# Find files modified in last 7 days
mc find myminio/my-bucket --newer-than 7d
For environments without mc, use pre-signed URLs with curl:
# First, generate upload URL with mc
UPLOAD_URL=$(mc share upload --json myminio/my-bucket/file.txt | jq -r '.share')
# Then upload with curl
curl -X PUT --upload-file /path/to/file.txt "$UPLOAD_URL"
# Generate download URL
DOWNLOAD_URL=$(mc share download --json myminio/my-bucket/file.txt | jq -r '.share')
# Download with curl
curl -o /local/path/file.txt "$DOWNLOAD_URL"
For direct API access without mc (simple authentication):
#!/bin/bash
# minio-upload.sh - Upload file to MinIO
bucket="$1"
file="$2"
host="${MINIO_ENDPOINT}"
s3_key="${MINIO_ACCESS_KEY}"
s3_secret="${MINIO_SECRET_KEY}"
resource="/${bucket}/${file}"
content_type="application/octet-stream"
date=$(date -R)
signature_string="PUT\n\n${content_type}\n${date}\n${resource}"
signature=$(echo -en "${signature_string}" | openssl sha1 -hmac "${s3_secret}" -binary | base64)
curl -X PUT -T "${file}" --header "Host: ${host}" --header "Date: ${date}" --header "Content-Type: ${content_type}" --header "Authorization: AWS ${s3_key}:${signature}" "https://${host}${resource}"
Usage:
chmod +x minio-upload.sh
./minio-upload.sh my-bucket myfile.txt
MinIO is fully compatible with AWS CLI:
# Configure AWS CLI for MinIO
aws configure set aws_access_key_id "${MINIO_ACCESS_KEY}"
aws configure set aws_secret_access_key "${MINIO_SECRET_KEY}"
aws configure set default.s3.signature_version s3v4
# List buckets
aws --endpoint-url "https://${MINIO_ENDPOINT}" s3 ls
# Upload file
aws --endpoint-url "https://${MINIO_ENDPOINT}" s3 cp file.txt s3://my-bucket/
# Download file
aws --endpoint-url "https://${MINIO_ENDPOINT}" s3 cp s3://my-bucket/file.txt ./
# List objects
aws --endpoint-url "https://${MINIO_ENDPOINT}" s3 ls s3://my-bucket/
mc anonymous set download myminio/my-bucket
mc anonymous set none myminio/my-bucket
# Create policy.json
cat > /tmp/policy.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {"AWS": ["*"]},
"Action": ["s3:GetObject"],
"Resource": ["arn:aws:s3:::my-bucket/public/*"]
}
]
}
EOF
mc anonymous set-json /tmp/policy.json myminio/my-bucket
mc mirror --watch for continuous syncjuliusbrussee/caveman
mattpocock/skills
shadcn/improve
obra/superpowers
forrestchang/andrej-karpathy-skills
vercel-labs/skills