Bucket Helper — utility functions for AWS S3 and any S3-compatible object storage (MinIO, Backblaze B2, DigitalOcean Spaces, Cloudflare R2, Wasabi, etc.) via boto3, exposed as library, argparse CLI, click CLI, FastAPI HTTP surface and MCP tools. credentials() loader, upload / download / list / delete / exists / make_bucket / remote_tempfile.
Project description
Bucket Helper
Bucket Helper belongs to a collection of libraries called AI Helpers developed for building Artificial Intelligence.
Utility functions for AWS S3 and any S3-compatible object storage — MinIO, Backblaze B2 S3 API, DigitalOcean Spaces, Cloudflare R2, Wasabi, and friends. Built on boto3. Same shape as sftp-helper: a credentials() loader, the usual CRUD (upload / download / delete / exists / list_prefix), and a remote_tempfile context manager for stage-and-share flows.
Installation
Prerequisites — Python 3.10–3.13 and git, cross-platform:
- 🍎 macOS (Homebrew):
brew install python git - 🐧 Ubuntu/Debian:
sudo apt update && sudo apt install -y python3 python3-pip git - 🪟 Windows (PowerShell):
winget install Python.Python.3.12 Git.Git
Then install the package:
pip install --force-reinstall --no-cache-dir git+https://github.com/warith-harchaoui/bucket-helper.git@v0.2.2
Optional extras — pick what you need:
# argparse CLI is always available. Add the click twin:
pip install 'bucket-helper[cli] @ git+https://github.com/warith-harchaoui/bucket-helper.git@v0.2.2'
# HTTP server (FastAPI + uvicorn + python-multipart):
pip install 'bucket-helper[api] @ git+https://github.com/warith-harchaoui/bucket-helper.git@v0.2.2'
# MCP tools (fastapi-mcp) — requires the [api] plumbing:
pip install 'bucket-helper[api,mcp] @ git+https://github.com/warith-harchaoui/bucket-helper.git@v0.2.2'
Configuration
A ready-to-fill template is committed at s3_config.json.example. Copy it to s3_config.json and edit in place — real *config.json files are gitignored so you cannot accidentally commit secrets:
cp s3_config.json.example s3_config.json
# then edit s3_config.json with your AWS / MinIO / R2 / B2 credentials
You may also write a s3_config.yaml, use a .env, or set environment variables — bucket-helper falls back in that order via os_helper.get_config. Required keys:
{
"s3_access_key": "AKIA...",
"s3_secret_key": "...",
"s3_bucket": "my-bucket",
"s3_https": "https://my-bucket.s3.eu-west-3.amazonaws.com"
}
Optional keys:
| Key | Default | Notes |
|---|---|---|
s3_region |
"us-east-1" |
AWS region; mostly cosmetic for MinIO / R2 |
s3_endpoint_url |
empty (= AWS S3) | Set this for S3-compatible backends — see table below |
s3_prefix |
empty | Default key prefix added by upload(...) when no destination is given |
s3_use_path_style |
"false" |
Force path-style addressing (endpoint/bucket/key instead of bucket.endpoint/key). Typical for MinIO with custom domains. |
s3_verify_ssl |
"true" |
Disable only for dev MinIO with self-signed certs |
Endpoint URLs for common S3-compatible storage
Set s3_endpoint_url to:
| Provider | Endpoint |
|---|---|
| AWS S3 | leave empty / unset |
| MinIO | http://minio.example.com:9000 (or https://... with TLS) |
| DigitalOcean Spaces | https://nyc3.digitaloceanspaces.com (region in subdomain) |
| Cloudflare R2 | https://<account_id>.r2.cloudflarestorage.com |
| Backblaze B2 (S3 API) | https://s3.<region>.backblazeb2.com |
| Wasabi | https://s3.<region>.wasabisys.com |
Usage
For the full catalog of recipes (uploads / downloads / listings, S3-compatible endpoints — MinIO / R2 / B2 / Spaces / Wasabi, temporary remote keys with auto-cleanup, mirroring with sftp-helper), see 📋 EXAMPLES.md.
import bucket_helper as bh
# Load creds — JSON / YAML / env / .env (auto-fallback in that order)
cred = bh.credentials("path/to/s3_config.json")
# Upload a local file
uri = bh.upload("local.txt", cred, "folder/uploaded.txt")
# uri == "s3://my-bucket/folder/uploaded.txt"
assert bh.exists(uri, cred)
# Download
bh.download(uri, "downloaded.txt", cred)
# List
for key in bh.list_prefix("folder/", cred):
print(key)
# Delete
bh.delete(uri, cred)
MinIO example
cred = {
"s3_access_key": "minioadmin",
"s3_secret_key": "minioadmin",
"s3_bucket": "uploads",
"s3_https": "http://minio.example.com:9000/uploads",
"s3_endpoint_url": "http://minio.example.com:9000",
"s3_use_path_style": "true",
"s3_region": "us-east-1", # MinIO accepts any region string
}
bh.make_bucket("uploads", cred)
bh.upload("file.bin", cred, "file.bin")
Stage-and-share with remote_tempfile
Drop a generated file at a unique random key, hand the public URL to a downstream worker / webhook, and the object is deleted on block exit (even if the body raises):
import bucket_helper as bh
import requests
cred = bh.credentials("path/to/s3_config.json")
with bh.remote_tempfile(cred, ext="json", prefix="runs") as (s3_addr, public_url):
bh.upload("payload.json", cred, s3_addr, content_type="application/json")
# Hand the URL to something that fetches it once.
requests.post("https://hook.example.com/process", json={"input_url": public_url}).raise_for_status()
# Object is gone here, no manual cleanup.
Multi-surface exposure
Every public function in the library is also exposed as:
- argparse CLI —
bucket-helper <subcommand>(installed by default). - click CLI —
bucket-helper-click <subcommand>(install[cli]extra). - FastAPI HTTP —
uvicorn bucket_helper.api:app --host 0.0.0.0 --port 8000(install[api]extra). - MCP tools —
bucket-helper-mcp(install[api,mcp]extras).
Both CLIs share the same subcommand names and flags — pick your favourite.
CLI examples
# argparse CLI (always available)
bucket-helper upload --config s3_config.json --input local.txt --key folder/uploaded.txt
bucket-helper exists --config s3_config.json --key folder/uploaded.txt
bucket-helper download --config s3_config.json --key folder/uploaded.txt --output back.txt
bucket-helper list --config s3_config.json --prefix folder/
bucket-helper delete --config s3_config.json --key folder/uploaded.txt
bucket-helper make-bucket --config s3_config.json --bucket new-bucket
bucket-helper tempfile --config s3_config.json --ext json --prefix runs
bucket-helper strip-path --config s3_config.json --address s3://my-bucket/path/to/obj
# click CLI — same verbs, same flags
bucket-helper-click upload --config s3_config.json --input local.txt --key folder/uploaded.txt
HTTP + MCP server
# Serve HTTP + MCP (default credentials picked up from BUCKET_HELPER_CONFIG)
BUCKET_HELPER_CONFIG=$PWD/s3_config.json bucket-helper-mcp
# Or run only FastAPI directly:
uvicorn bucket_helper.api:app --host 0.0.0.0 --port 8000
# → Swagger UI at http://localhost:8000/docs
Per-request credentials can also be sent as multipart form fields
(s3_access_key / s3_secret_key / s3_bucket / s3_https / …).
Docker
docker build -t bucket-helper .
docker run --rm -p 8000:8000 \
-e BUCKET_HELPER_CONFIG=/config/s3_config.json \
-v $PWD/s3_config.json:/config/s3_config.json:ro \
bucket-helper
See also: LANDSCAPE.md (competitive positioning) and GUI.md (visual product design plan).
Author
Acknowledgements
Special thanks to Mohamed Chelali and Bachir Zerroug for fruitful discussions.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file bucket_helper-0.2.2.tar.gz.
File metadata
- Download URL: bucket_helper-0.2.2.tar.gz
- Upload date:
- Size: 29.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cb65ea2b328f33b33fd135276a5a95995c99144ba75dbdf8a4fb34b6d51d5434
|
|
| MD5 |
b37c4eae4f1d1b06e605d93072db80da
|
|
| BLAKE2b-256 |
5da5ab51a402e087ec4a9b36d60a45fbd7bc88bee67481da17a646977c85a475
|
File details
Details for the file bucket_helper-0.2.2-py3-none-any.whl.
File metadata
- Download URL: bucket_helper-0.2.2-py3-none-any.whl
- Upload date:
- Size: 26.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6b930fd61b7081321406186adb79b690be816eee49dcbe4affaef65fe4f0d55b
|
|
| MD5 |
8d564a4866a5f1bc51a323e5f68087cf
|
|
| BLAKE2b-256 |
e082058d1d10bec9b8a7a7e35f0c3740db353fb6fb40fe6922f17c2ae9f32b82
|