{"_id":"@afomera/s3-mcp","name":"@afomera/s3-mcp","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@afomera/s3-mcp","version":"0.1.0","description":"MCP server for uploading assets to any S3-compatible bucket (Cloudflare R2, AWS S3, MinIO, etc.)","type":"module","bin":{"s3-mcp":"dist/index.js"},"scripts":{"build":"tsc","prepublishOnly":"npm run build","test":"vitest run"},"keywords":["mcp","s3","cloudflare-r2","aws-s3","minio","assets","upload","claude","ai"],"license":"MIT","engines":{"node":">=18.0.0"},"dependencies":{"@aws-sdk/client-s3":"^3.985.0","@modelcontextprotocol/sdk":"^1.26.0","mime":"^4.1.0","zod":"^4.3.6"},"devDependencies":{"@types/node":"^25.2.1","typescript":"^5.9.3","vitest":"^4.0.18"},"_id":"@afomera/s3-mcp@0.1.0","_nodeVersion":"25.4.0","_npmVersion":"11.7.0","dist":{"integrity":"sha512-O2hm/s2b+OjBo4vKCohHcyalnYIQZ61Tr6XWXzBtfBxL5/WnT/0gJq2w+vTonNKtekbRbG7jhu69Wfy166kj/g==","shasum":"b844cf54ee947dc5a9604de9f09c29f78488a1c6","tarball":"https://registry.npmjs.org/@afomera/s3-mcp/-/s3-mcp-0.1.0.tgz","fileCount":15,"unpackedSize":27682,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCVK0EI4VTjMxL2DAMrtDdyyiR9AJ8QG+BZpx8IfL7vIgIgb+6aIgqWi/YWs1fLsdds8lYjfGrFQSuqq7cygHRjnE0="}]},"_npmUser":{"name":"afomera","email":"andrea.fomera@gmail.com"},"directories":{},"maintainers":[{"name":"afomera","email":"andrea.fomera@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/s3-mcp_0.1.0_1770450340583_0.566234197308161"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-07T07:45:40.526Z","0.1.0":"2026-02-07T07:45:40.751Z","modified":"2026-02-07T07:45:40.911Z"},"maintainers":[{"name":"afomera","email":"andrea.fomera@gmail.com"}],"description":"MCP server for uploading assets to any S3-compatible bucket (Cloudflare R2, AWS S3, MinIO, etc.)","keywords":["mcp","s3","cloudflare-r2","aws-s3","minio","assets","upload","claude","ai"],"license":"MIT","readme":"# @afomera/s3-mcp\n\nA lightweight [MCP](https://modelcontextprotocol.io) server that lets AI coding agents upload files to any S3-compatible bucket and get back public URLs. Works with **Cloudflare R2**, **AWS S3**, **MinIO**, **DigitalOcean Spaces**, **Backblaze B2**, **Wasabi**, and any other S3-compatible provider.\n\nPrimary use case: uploading screenshots, images, and other assets during PR reviews, then pasting the URLs into GitHub comments and issues.\n\n## Quick Start\n\n### Cloudflare R2\n\n```bash\nclaude mcp add \\\n  -e S3_ENDPOINT=https://<account_id>.r2.cloudflarestorage.com \\\n  -e S3_ACCESS_KEY_ID=your_key \\\n  -e S3_SECRET_ACCESS_KEY=your_secret \\\n  -e S3_BUCKET=my-assets \\\n  -e S3_PUBLIC_URL=https://assets.example.com \\\n  s3-mcp \\\n  -- npx -y @afomera/s3-mcp\n```\n\n### AWS S3\n\n```bash\nclaude mcp add \\\n  -e S3_ENDPOINT=https://s3.us-east-1.amazonaws.com \\\n  -e S3_REGION=us-east-1 \\\n  -e S3_ACCESS_KEY_ID=AKIA... \\\n  -e S3_SECRET_ACCESS_KEY=your_secret \\\n  -e S3_BUCKET=my-assets \\\n  -e S3_PUBLIC_URL=https://my-assets.s3.amazonaws.com \\\n  s3-mcp \\\n  -- npx -y @afomera/s3-mcp\n```\n\n### MinIO (local dev)\n\n```bash\nclaude mcp add \\\n  -e S3_ENDPOINT=http://localhost:9000 \\\n  -e S3_REGION=us-east-1 \\\n  -e S3_ACCESS_KEY_ID=minioadmin \\\n  -e S3_SECRET_ACCESS_KEY=minioadmin \\\n  -e S3_BUCKET=dev-assets \\\n  -e S3_PUBLIC_URL=http://localhost:9000/dev-assets \\\n  s3-mcp \\\n  -- npx -y @afomera/s3-mcp\n```\n\n### DigitalOcean Spaces\n\n```bash\nclaude mcp add \\\n  -e S3_ENDPOINT=https://nyc3.digitaloceanspaces.com \\\n  -e S3_REGION=nyc3 \\\n  -e S3_ACCESS_KEY_ID=your_key \\\n  -e S3_SECRET_ACCESS_KEY=your_secret \\\n  -e S3_BUCKET=my-space \\\n  -e S3_PUBLIC_URL=https://my-space.nyc3.digitaloceanspaces.com \\\n  s3-mcp \\\n  -- npx -y @afomera/s3-mcp\n```\n\n## Team Sharing (`.mcp.json`)\n\nAdd to your project's `.mcp.json` so the whole team gets the MCP server automatically:\n\n```json\n{\n  \"mcpServers\": {\n    \"s3-mcp\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@afomera/s3-mcp\"],\n      \"env\": {\n        \"S3_ENDPOINT\": \"${S3_ENDPOINT}\",\n        \"S3_ACCESS_KEY_ID\": \"${S3_ACCESS_KEY_ID}\",\n        \"S3_SECRET_ACCESS_KEY\": \"${S3_SECRET_ACCESS_KEY}\",\n        \"S3_BUCKET\": \"${S3_BUCKET}\",\n        \"S3_PUBLIC_URL\": \"${S3_PUBLIC_URL}\"\n      }\n    }\n  }\n}\n```\n\nEach team member sets the actual values in their environment.\n\n## Environment Variables\n\n| Variable | Required | Description |\n|---|---|---|\n| `S3_ENDPOINT` | Yes | Full endpoint URL for your S3-compatible provider |\n| `S3_ACCESS_KEY_ID` | Yes | Access key |\n| `S3_SECRET_ACCESS_KEY` | Yes | Secret key |\n| `S3_BUCKET` | Yes | Bucket name |\n| `S3_PUBLIC_URL` | Yes | Public base URL for the bucket |\n| `S3_REGION` | No | Region (defaults to `auto`) |\n| `S3_PATH_PREFIX` | No | Auto-prefix for all keys (e.g. `uploads/`) |\n\n## Tools\n\n### `upload_file`\n\nUpload a local file to the bucket and return its public URL.\n\n```json\n{ \"file_path\": \"/path/to/screenshot.png\" }\n```\n\nReturns: `{ \"url\": \"https://...\", \"key\": \"...\", \"size\": 45230, \"content_type\": \"image/png\" }`\n\n### `upload_base64`\n\nUpload base64-encoded data directly.\n\n```json\n{ \"data\": \"iVBORw0KGgo...\", \"filename\": \"screenshot.png\" }\n```\n\n### `upload_from_url`\n\nFetch a file from a URL and upload it to the bucket.\n\n```json\n{ \"url\": \"https://ci.example.com/artifacts/screenshot.png\" }\n```\n\n### `list_files`\n\nList files in the bucket, optionally filtered by prefix.\n\n```json\n{ \"prefix\": \"20250207\", \"max_results\": 20 }\n```\n\n### `delete_file`\n\nDelete a file from the bucket.\n\n```json\n{ \"key\": \"20250207-a1b2c3-screenshot.png\" }\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md","_rev":"1-d352f9d548cdf4134c16c63a2005c420"}