Le serveur MCP Supabase donne à un agent les clés de votre base de données : il peut lister les tables, exécuter du SQL, appliquer des migrations, déployer des Edge Functions et créer des branches. Cela en fait l'un des serveurs MCP les plus utiles pour quiconque développe sur Supabase, et l'un des rares à offrir une véritable leçon publique sur ce qui dérape quand un agent lit des données écrites par un attaquant.
Nous avons lu la documentation de Supabase et le code source du serveur le 14 novembre 2026, et avons fait tourner la version 0.17.0 du paquet, publiée la veille, dans MCP Inspector pour compter ce que chaque réglage expose réellement. Nous avons aussi sondé l'endpoint hébergé. Nous n'avons pas connecté de projet réel.
Hébergé, local ou sur votre propre infrastructure
| Hébergé | Paquet npm | CLI Supabase | Auto-hébergé | |
|---|---|---|---|---|
| Où | https://mcp.supabase.com/mcp |
npx -y @supabase/mcp-server-supabase |
http://localhost:54321/mcp |
http://localhost:8080/mcp via un tunnel SSH |
| Connexion | OAuth, sans jeton | Jeton d'accès personnel | Aucune | Aucune |
| Outils | Ensemble complet | Ensemble complet, moins quelques-uns qui nécessitent la connexion hébergée | Un sous-ensemble plus restreint | Un sous-ensemble plus restreint |
| À utiliser pour | La plupart des tâches | Les clients sans prise en charge de HTTP, la CI | Le développement local | Votre propre déploiement Supabase |
Le serveur hébergé est la recommandation par défaut, et il ne nécessite rien sur votre machine. Nous lui avons envoyé une requête non authentifiée et avons reçu un 401 renvoyant vers ses métadonnées OAuth, qui désignent l'API de Supabase comme serveur d'autorisation et listent des scopes allant de organizations:read à database:write. Votre client gère la connexion dans le navigateur. Choisissez l'organisation propriétaire du projet sur l'écran de consentement.
Une limite actuelle d'OAuth : le consentement accorde l'ensemble complet des scopes. L'article de lancement de Supabase indiquait que des permissions plus fines étaient prévues ; la documentation actuelle précise toujours que tous les scopes sont requis pour une application OAuth manuelle. Un jeton d'accès personnel peut être plus restreint, et la documentation de Supabase liste la permission dont chaque outil a besoin.
Installation
Tous les clients utilisent la même URL. Ajoutez les options décrites ci-dessous pour en restreindre la portée.
Claude Code :
claude mcp add --scope project --transport http supabase "https://mcp.supabase.com/mcp?project_ref=YOUR_REF&read_only=true"
Lancez ensuite claude /mcp dans un terminal classique, sélectionnez supabase et choisissez Authenticate.
Cursor, dans .cursor/mcp.json :
{
"mcpServers": {
"supabase": {
"url": "https://mcp.supabase.com/mcp?project_ref=YOUR_REF&read_only=true"
}
}
}
VS Code, dans .vscode/mcp.json, qui utilise servers :
{
"servers": {
"supabase": {
"type": "http",
"url": "https://mcp.supabase.com/mcp?project_ref=YOUR_REF&read_only=true"
}
}
}
Codex :
codex mcp add supabase --url "https://mcp.supabase.com/mcp?project_ref=YOUR_REF&read_only=true"
Puis codex mcp login supabase. Claude.ai et ChatGPT proposent Supabase dans leurs répertoires de connecteurs. La documentation de Supabase ne fournit pas d'étapes distinctes pour Claude Desktop ni Windsurf ; son README suggère de copier l'entrée HTTP générique dans tout client qu'elle ne liste pas.
Le tableau de bord peut générer l'URL à votre place : ouvrez un projet, cliquez sur Connect, puis choisissez l'onglet MCP. Le package local s'exécute ainsi, avec le token dans SUPABASE_ACCESS_TOKEN :
npx -y @supabase/mcp-server-supabase@latest --read-only --project-ref=YOUR_REF
Sans token, il se termine avec le message « Please provide a personal access token (PAT) with the --access-token flag or set the SUPABASE_ACCESS_TOKEN environment variable ».
Ce que les options retirent
Trois paramètres d'URL, ou les flags correspondants pour le paquet local, déterminent ce que reçoit l'agent :
| Paramètre d'URL hébergé | Flag local | Effet |
|---|---|---|
read_only=true |
--read-only |
Les requêtes s'exécutent avec un utilisateur Postgres en lecture seule ; les outils d'écriture sont masqués |
project_ref=abc123 |
--project-ref=abc123 |
Un seul projet ; les outils de compte sont masqués |
features=database,docs |
--features=database,docs |
Uniquement ces groupes d'outils |
Nous avons compté les outils pour chaque réglage sur la 0.17.0 :
| Réglage | Outils |
|---|---|
| Les dix groupes | 39 |
| Valeurs par défaut (storage désactivé) | 36 |
| Valeurs par défaut avec lecture seule | 22 |
| Lecture seule et limité à un projet | 16 |
La lecture seule a retiré 14 outils : create_project, pause_project, restore_project, apply_migration, deploy_edge_function, les cinq écritures de branches, create_notebook, delete_notebook et les deux outils de feedback. execute_sql reste, mais la base elle-même refuse les écritures car la requête s'exécute avec un rôle en lecture seule. C'est plus robuste qu'un filtre sur le texte SQL.
Les groupes, tous activés par défaut sauf storage :
| Groupe | Outils |
|---|---|
docs |
search_docs |
account |
lister et récupérer les organisations et projets, get_cost, confirm_cost ; créer, mettre en pause et restaurer des projets |
database |
list_tables, list_extensions, list_migrations, execute_sql, apply_migration |
debugging |
query_logs, get_advisors pour les conseils de sécurité et de performance |
development |
get_project_url, get_publishable_keys, generate_typescript_types |
functions |
lister, récupérer et déployer des Edge Functions ; définir un secret sur le serveur hébergé |
branching |
lister, créer, supprimer, fusionner, réinitialiser et rebaser des branches, sur les plans payants |
storage |
lister les buckets, lire et mettre à jour la configuration de storage |
notebooks |
lister, récupérer, exécuter, créer et supprimer des notebooks SQL |
feedback |
envoyer un feedback à Supabase |
Les anciens guides mentionnent get_logs ; dans la 0.17.0, c'est query_logs. Retirer un groupe est l'étape de sécurité la moins coûteuse qui soit : sans functions, l'outil de déploiement n'atteint jamais le modèle.
Ce qui s'est passé en juillet 2025
Le 6 juillet 2025, Simon Willison a relaté une démonstration de General Analysis sous le titre « Supabase MCP can leak your entire SQL database ». Le scénario était une application de support. L'agent Cursor d'un développeur utilisait Supabase MCP avec la clé service_role, qui contourne la sécurité au niveau des lignes. Un attaquant a déposé un ticket de support via le formulaire public, et le texte du ticket s'adressait directement à l'IA, lui demandant de lire une table privée integration_tokens et de republier son contenu dans le ticket. Lorsque le développeur a demandé à l'agent de consulter les tickets ouverts, il l'a fait exactement.
Willison a parlé de la « trifecta létale » : des données privées, une exposition à du texte contrôlé par un attaquant et un moyen d'exfiltrer des données, le tout dans un seul agent.
Supabase a répondu en septembre 2025. L'entreprise a déclaré que le titre exagérait le risque, que la démonstration utilisait un rôle privilégié dans un environnement local et qu'aucun client n'avait signalé de fuite via MCP. Elle a aussi indiqué que ses propres mesures d'atténuation « réduisaient le risque sans l'éliminer » et que « les garde-fous seuls ne suffisent pas ». Ces mesures correspondent désormais aux options ci-dessus : le mode lecture seule, le cadrage par projet et les groupes de fonctionnalités. Le serveur encapsule également chaque résultat SQL dans une frontière marquée par un ID aléatoire, accompagnée d'une note indiquant au modèle de ne pas suivre les instructions qu'elle contient. Supabase qualifie cet encapsulage de « pas infaillible ».
Le mode lecture seule mérite d'être compris précisément. Dans la démonstration, il aurait empêché la dernière étape, la réécriture des données volées dans un ticket. Il n'aurait pas empêché l'agent de lire la table privée et de la répéter au développeur, ni de la transmettre à tout autre outil auquel l'agent avait accès.
Configuration sécurisée, étape par étape
- Pas la production, si vous pouvez l'éviter. La formulation actuelle de Supabase est de se connecter à la production « uniquement lorsque la tâche exige des preuves de production ». Un projet de développement ou une branche est le meilleur choix par défaut.
- Limitez le périmètre.
project_refmaintient l'agent à l'intérieur d'un seul projet. - Lecture seule par défaut. Activez l'écriture pour les sessions qui en ont besoin.
- Moins de groupes.
features=database,docscouvre la plupart des travaux sur le schéma et les requêtes. - Gardez l'approbation activée. La documentation de Supabase recommande de vérifier chaque appel d'outil ; n'utilisez pas « toujours approuver » pour ce serveur. Les formulaires de confirmation pour le SQL destructif n'apparaissent que dans les clients qui les prennent en charge, et Supabase les qualifie de « garde-fou, pas une garantie ».
- Ne le donnez jamais à vos clients. Il s'exécute avec vos permissions de développeur.
Pour les tâches non supervisées, Supabase conseille de pré-approuver uniquement les outils en lecture seule et limités au projet, et de faire en sorte que la tâche s'arrête et fasse un rapport plutôt que d'écrire. Pour en savoir plus sur le problème général, voir Sécurité MCP.
Skills et plugins
Supabase publie aussi des agent skills, distinctes du MCP server, avec des recommandations pour les bonnes pratiques Supabase et Postgres : npx skills add supabase/agent-skills, ou dans Claude Code via son marketplace de plugins. L'entrée MCP du dépôt de skills pointe vers https://mcp.supabase.com/mcp?features=docs, docs uniquement, sans accès à la base de données, ce qui est un choix par défaut judicieux si tout ce que vous voulez, ce sont des réponses exactes sur Supabase.
Quand cela ne fonctionne pas
| Ce que vous voyez | Cause | Correction |
|---|---|---|
| 401 renvoyé par le serveur hébergé | Vous n'êtes pas connecté | Lancez l'étape d'authentification de votre client, par exemple claude /mcp |
| « Please provide a personal access token » | Paquet local sans jeton | Définissez SUPABASE_ACCESS_TOKEN ou passez --access-token |
| Un outil d'un tutoriel est absent | Lecture seule, groupe de fonctionnalités manquant ou outil renommé | Consultez les tableaux ci-dessus ; get_logs s'appelle désormais query_logs |
| L'agent ne voit pas vos autres projets | project_ref est défini |
C'est voulu ; retirez-le uniquement si vous avez besoin des outils de compte |
| Les écritures échouent avec des erreurs de permission | read_only=true |
C'est voulu ; utilisez une entrée distincte sans portée pour les sessions d'écriture |
| Aucun outil de stockage | Le stockage est désactivé par défaut | Ajoutez storage à features |
Moins d'outils sur localhost:54321 |
La CLI n'expose qu'un sous-ensemble | Utilisez le serveur hébergé pour disposer de l'ensemble complet |
Les serveurs Supabase de notre catalogue, avec leurs scores de vérification, sont listés en haut de cette page. Pour de simples bases de données Postgres, consultez les serveurs MCP Postgres.