Supabase Storage MCP Server
This server provides tools to manage Supabase Storage buckets and files, focusing on additive-only operations — no deletion or overwriting is permitted.
List buckets — View all existing buckets with their public/private status, file size limits, and allowed file types.
Create a bucket — Create new storage buckets with configurable privacy, allowed MIME types, and file size limits.
Upload a file — Upload a local file to a bucket with pre-upload validation of file type and size; never overwrites existing files.
List files — Browse files in a bucket or specific folder, with file sizes and last-updated dates.
Get a signed (temporary) URL — Generate a temporary shareable link for files in private buckets, valid for 1–30 days (default 7).
Get a public URL — Retrieve a permanent public web link for files in public buckets.
Move or rename a file — Move or rename a file within or across buckets; never overwrites an existing file at the destination.
Copy a file — Copy a file within a bucket or to another bucket, keeping the original in place; never overwrites existing files.
⚠️ No destructive operations (delete, overwrite, empty) are available.
Provides tools for managing Supabase storage buckets and files, including creating buckets, uploading files, listing files, generating signed URLs, and moving files.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Supabase Storage MCP ServerCreate a new bucket for the Q3 launch."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Supabase Storage plugin for Claude
A Claude Code plugin that lets you create storage buckets and upload media (images, video, audio, PDFs, design assets) to Supabase — just by chatting with Claude. It fills the gap left by the official Supabase MCP, which has no Storage bucket API.
Storage-only and additive-only by design:
🚫 No delete anything. There is no tool to delete, remove, or empty a bucket or file.
🚫 No overwrite. Uploads and moves never replace an existing file — a name clash fails cleanly.
🚫 No database access. The plugin exposes storage tools only; it cannot read or change your data.
Were you handed this folder to use, not to set up? Open START-HERE.md — a 3-minute, plain-language guide. The rest of this README is for whoever installs and configures it.
Part 1 — Setup (for whoever installs it)
What you need
Node.js 18 or newer (
node --version).Access to your Supabase project in the Supabase dashboard.
Step 1 — Get your two credentials from Supabase
In the Supabase dashboard, open the project, then:
Project URL — Project Settings → Data API → Project URL (looks like
https://abcdefghijklmno.supabase.co).Service role key — Project Settings → API Keys → reveal the
service_rolekey.
⚠️ The service role key is sensitive — treat it like a password. It can access the whole project, so never commit it, paste it in chat, or share it. This plugin only ever uses it for Storage operations and exposes no database tools, but the key itself is still powerful. Keep it in the
.envfile (which is gitignored) and nowhere else.
Step 2 — Configure the plugin
Copy the template to a real env file, in the plugin folder:
cp .env.example .envOpen
.envand paste your two values:SUPABASE_URL=https://<your-project-ref>.supabase.co SUPABASE_SERVICE_ROLE_KEY=<your-service-role-key>
Step 3 — Install and build
The plugin ships with a prebuilt dist/, so if you just cloned it you can usually skip straight to
installing it in Claude. If you edited the source (or want to be sure), run:
npm install # installs dependencies and builds dist/ automatically
npm test # optional: runs the guardrail tests (should print "pass 10")Step 4 — Install the plugin in Claude Code
Add this folder as a plugin (via your Claude Code plugin marketplace/config). The plugin's
.claude-plugin/plugin.json registers a local stdio MCP server that runs dist/index.js. Once
installed, Claude will have eight supabase-storage tools and the /upload-media guide available.
To verify quickly from a terminal, you can start the server directly — it should print
supabase-storage MCP server ready:
npm startThe eight tools
Tool | What it does |
| List buckets with their public/private, size limit, and allowed types |
| Create a bucket (naming convention enforced; defaults to private, 50MB, common media) |
| Upload a local file (validates type + size first; never overwrites) |
| List files in a bucket (optionally in a folder), with sizes and dates |
| Make a temporary shareable link (default 7 days) — works for private buckets |
| Get the permanent public link — for public buckets |
| Rename or move a file — within a bucket or into another bucket (never overwrites) |
| Copy a file — within a bucket or into another bucket — keeping the original (never overwrites) |
Bucket naming convention
Enforced in code. A bucket name must start with an allowed category prefix, then lowercase words joined by dashes:
^(marketing|brand|campaigns|media|assets)(-[a-z0-9]+)+$Examples: marketing-q3-launch, brand-logos, campaigns-spring-2026, media-product-shots,
assets-social-templates.
To add or change the allowed prefixes, edit ALLOWED_BUCKET_PREFIXES in
src/config.ts and run npm run build.
Related MCP server: S3 MCP Server
Part 2 — How to use it (for the marketing team)
You don't need to know any of the technical stuff. Just talk to Claude. Try the /upload-media
command, or say things like:
"What storage buckets do we have?" → Claude lists them.
"Make a new bucket for the Q3 launch." → Claude creates
marketing-q3-launch(it'll ask if it should be private or public)."Upload C:\Users\me\Pictures\hero.png to the marketing-q3-launch bucket." → Claude uploads it and tells you where it landed.
"Give me a shareable link for hero.png." → Claude makes a link (a temporary one for private buckets, valid 7 days by default; a permanent one for public buckets).
"Rename hero.png to hero-final.png." → Claude moves it.
Good to know:
Nothing you do here can delete or overwrite a file. If a name is already taken, Claude will ask you to pick a different one. Explore freely.
Private vs public: private files are shared with a temporary link; public files (like logos) get a permanent web link. When in doubt, private is the safe default.
If something doesn't work, Claude will explain it in plain language — e.g. "that file type isn't allowed here" or "that bucket doesn't exist yet." If it mentions credentials or the network, that's a setup issue — tell whoever installed the plugin; it's not something you did wrong.
Part 3 — Quick test checklist (for the installer, after setup)
Run through this once with Claude to confirm everything works end to end:
Create a bucket — ask Claude to create
media-test-bucket(private). ✅ It's created.Upload an image — ask Claude to upload a small image to it. ✅ It returns the stored path and offers a signed link.
List files — ask Claude to list files in
media-test-bucket. ✅ Your image appears with its size and date.Signed URL — ask for a shareable link to the image. ✅ You get a URL; opening it shows the image.
Duplicate upload fails — upload the same file to the same path again. ✅ It fails with "that name is already taken — choose a different name" (nothing is overwritten).
Bad bucket name fails — ask Claude to create a bucket called
TestBucketorrandom-name. ✅ It's refused with an explanation of the naming rule.
If all six behave as described, the plugin is working.
How it's built
TypeScript stdio MCP server using
@modelcontextprotocol/sdkand@supabase/supabase-js.Source in
src/(one file per tool undersrc/tools/), compiled todist/.Guardrails live in code: naming regex and defaults in
src/config.ts; client-side validation insrc/validation.ts; friendly error mapping insrc/errors.ts.npm testruns guardrail tests, including a structural check that no destructive Storage call (.remove,deleteBucket,emptyBucket) and noupsert: trueexists anywhere in the build.
This is an interim, disposable tool and may be replaced by a more complete solution later.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/danizeap/Supabase-MCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server