minio

$npx mdskill add vm0-ai/vm0-skills/minio

Manage S3-compatible object storage via MinIO CLI commands.

  • Handles bucket creation, file uploads, downloads, and deletion tasks.
  • Integrates with MinIO CLI (mc) for direct storage operations.
  • Executes commands based on user requests for storage management.
  • Outputs command results and generates pre-signed URLs for sharing.

SKILL.md

.github/skills/minioView on GitHub ↗
---
name: minio
description: MinIO API for S3-compatible storage. Use when user mentions "MinIO",
  "S3 storage", "object storage", or self-hosted S3.
---

## How to Use

### 1. List Buckets

```bash
mc ls myminio
```

### 2. Create a Bucket

```bash
mc mb myminio/my-bucket
```

### 3. Upload a File

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

### 4. Download a File

```bash
# Download single file
mc cp myminio/my-bucket/file.txt /local/path/

# Download entire bucket
mc cp --recursive myminio/my-bucket/ /local/path/
```

### 5. List Objects in Bucket

```bash
# List all objects
mc ls myminio/my-bucket

# List recursively with details
mc ls --recursive --summarize myminio/my-bucket
```

### 6. Delete Objects

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

### 7. Generate Pre-signed URL

Create temporary shareable links:

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

### 8. Mirror/Sync Directories

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

### 9. Get Object Info

```bash
# Get file metadata
mc stat myminio/my-bucket/file.txt

# Get bucket info
mc stat myminio/my-bucket
```

### 10. Search Objects

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

## Using curl with Pre-signed URLs

For environments without `mc`, use pre-signed URLs with curl:

### Upload with Pre-signed URL

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

### Download with Pre-signed URL

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

## Using curl with AWS Signature V2

For direct API access without mc (simple authentication):

```bash
#!/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:

```bash
chmod +x minio-upload.sh
./minio-upload.sh my-bucket myfile.txt
```

## Using AWS CLI

MinIO is fully compatible with AWS CLI:

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

## Bucket Policies

### Set Bucket to Public Read

```bash
mc anonymous set download myminio/my-bucket
```

### Set Bucket to Private

```bash
mc anonymous set none myminio/my-bucket
```

### Apply Custom Policy

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

## Guidelines

1. **Use mc for most operations** - It handles authentication and signing automatically
2. **Pre-signed URLs for external access** - Share files without exposing credentials
3. **Use port 9000 for API** - Port 9001 is typically the web console
4. **Set appropriate expiry** - Pre-signed URLs should expire as soon as practical (max 7 days)
5. **Use mirror for backups** - `mc mirror --watch` for continuous sync
6. **Bucket naming rules** - Lowercase, 3-63 characters, no underscores or consecutive dots

More from vm0-ai/vm0-skills

SkillDescription
account-reconciliationPerform account reconciliations comparing general ledger balances against subledgers, bank statements, or external records. Use for bank reconciliation, GL-to-subledger reconciliation, intercompany reconciliation, balance sheet reconciliation, reconciling item analysis, outstanding item aging, or clearing open items.
agentphoneBuild AI phone agents with AgentPhone API. Use when the user wants to make phone calls, send/receive SMS, manage phone numbers, create voice agents, set up webhooks, or check usage — anything related to telephony, phone numbers, or voice AI.
ahrefsAhrefs SEO API for backlink and keyword analysis. Use when user mentions
amplitudeAmplitude product analytics API. Use when user mentions "Amplitude",
analysis-qaQuality-check a data analysis before sharing — verify joins, aggregations, denominators, time ranges, and metric definitions. Detect pitfalls like survivorship bias, average-of-averages, join explosion, timezone mismatches, incomplete periods, and selection bias. Includes documentation templates for reproducible analyses.
anthropic-managed-agentsAnthropic Managed Agents API for programmatically creating, running, and streaming AI agents on Anthropic's cloud infrastructure. Use when the user mentions "Managed Agents", "Anthropic agent sessions", or needs to create/run/stream an Anthropic agent with tool use (bash, git, web), attach GitHub repositories, or inject secrets via Vault. Do NOT use for standard Claude Messages API — use the Claude API skill instead.
apifyApify web scraping platform. Use when user mentions "scrape website",
asanaAsana API for tasks and projects. Use when user mentions "Asana", "asana.com",
atlassianAtlassian API for Confluence and Jira. Use when user mentions "Confluence
attioAttio REST API for AI-native CRM operations — manage companies, people, deals, and custom objects, plus notes, tasks, lists, and comments. Use when the user mentions "Attio", "CRM record", "create company", "add person", "list entry", "CRM note", or "CRM task".