Supabase 是一个开源的后端即服务平台,涵盖数据库、认证(Auth)、边缘函数(Edge Functions)、实时(Realtime)、存储(Storage)、向量(Vectors)、定时任务(Cron)与队列(Queues)等产品。本技能用于在涉及 Supabase 的任何任务中提供操作指导。
核心原则
-
Supabase 变化频繁,实施前应核对当前文档。不要依赖训练数据中的 Supabase 功能信息,函数签名、config.toml 设置与 API 约定会随版本变化。实施前应通过下述文档访问方式查找相关主题。
-
验证你的工作。实施任何修复后,运行测试查询确认改动生效。未经验证的修复不算完成。
-
从错误中恢复,不要循环重试。若某方法失败 2-3 次,应停止并重新考虑:换一种方法、查阅文档、更仔细地检查错误,并在可用时查看相关日志。Supabase 问题并非总能通过重复同一命令解决,答案也不总在日志中,但继续之前查看日志往往值得。
-
暴露的 schema 默认启用 RLS。在任何暴露 schema(尤其是 public)的每张表上启用 RLS。这在 Supabase 中至关重要,因为暴露 schema 中的表可通过 Data API 访问。对于私有 schema,建议以 RLS 作为纵深防御。启用 RLS 后,应创建与实际访问模型匹配的策略,而不是把每张表都默认套用同一个 auth.uid() 模式。
-
安全清单。处理任何涉及认证、RLS、视图、存储或用户数据的 Supabase 任务时,应逐项核对以下 Supabase 特有的安全陷阱:
认证与会话安全
- 绝不要在基于 JWT 的授权决策中使用 user_metadata 声明。在 Supabase 中,raw_user_meta_data 可由用户编辑并可能出现在 auth.jwt() 中,因此用于 RLS 策略或任何授权逻辑都不安全。授权数据应存放在 raw_app_meta_data / app_metadata 中。
- 删除用户不会使现有访问令牌失效。应先登出或撤销会话,敏感应用保持较短的 JWT 过期时间;如需严格保证,在敏感操作中对照 auth.sessions 校验 session_id。
- 若使用 app_metadata 或 auth.jwt() 进行授权,请记住在用户令牌刷新前,JWT 声明并不总是最新的。
API 密钥与客户端暴露
- 绝不要在公开客户端暴露 service_role 或 secret key。前端代码优先使用 publishable keys。旧版 anon keys 仅用于兼容。在 Next.js 中,任何 NEXT_PUBLIC_ 环境变量都会发送到浏览器。
RLS、视图与特权数据库代码
- 视图默认绕过 RLS。在 Postgres 15 及以上,使用 CREATE VIEW ... WITH (security_invoker = true)。在更早的 Postgres 版本中,通过撤销 anon 与 authenticated 角色的访问权限,或将视图放入未暴露的 schema 来保护。
- UPDATE 需要 SELECT 策略。在 Postgres RLS 中,UPDATE 需要先 SELECT 该行。没有 SELECT 策略时,更新会静默返回 0 行——没有错误,只是没有变化。
- 不要把 security definer 函数放在暴露的 schema 中。应放在私有或未暴露的 schema 中。
存储访问控制
- 存储 upsert 需要 INSERT + SELECT + UPDATE。只授予 INSERT 允许新上传,但文件替换(upsert)会静默失败。三者都需要。
对于上述未涵盖的任何安全问题,请获取 Supabase 产品安全索引:https://supabase.com/docs/guides/security/product-security.md
Supabase CLI
始终通过 --help 发现命令——绝不要猜测。CLI 结构会随版本变化。
supabase --help # 所有顶层命令 supabase <group> --help # 子命令(例如 supabase db --help) supabase <group> <command> --help # 特定命令的标志
Supabase CLI 已知注意事项:
- supabase db query 需要 CLI v2.79.0+ → 回退使用 MCP execute_sql 或 psql
- supabase db advisors 需要 CLI v2.81.3+ → 回退使用 MCP get_advisors
- 需要新的迁移 SQL 文件时,始终先用 supabase migration new <name> 创建。绝不要臆造迁移文件名或凭记忆猜测预期格式。
版本检查与升级:运行 supabase --version 检查。CLI 变更日志与版本特定功能请查阅 CLI 文档或 GitHub releases。
Supabase MCP Server
设置说明、服务器 URL 与配置见 MCP 设置指南。
连接问题排障——按顺序执行以下步骤:
-
检查服务器是否可达: curl -so /dev/null -w "%{http_code}" https://mcp.supabase.com/mcp 返回 401 是预期的(无令牌),表示服务器正常。超时或“connection refused”表示可能宕机。
-
检查 .mcp.json 配置: 确认项目根目录有有效的 .mcp.json 且服务器 URL 正确。若缺失,创建一个指向 https://mcp.supabase.com/mcp。
-
认证 MCP 服务器: 若服务器可达且 .mcp.json 正确但工具不可见,用户需要认证。Supabase MCP 服务器使用 OAuth 2.1——告知用户在 agent 中触发认证流程,在浏览器中完成,并重新加载会话。
Supabase 文档
实施任何 Supabase 功能前,先找到相关文档。按优先级使用以下方法:
- MCP search_docs 工具(首选——直接返回相关片段)
- 以 markdown 获取文档页面——任何文档页面都可通过在 URL 路径后追加 .md 获取。
- 当不知道查看哪个页面时,对 Supabase 特定主题进行网络搜索。
进行与提交 schema 变更
要进行 schema 变更,使用 execute_sql(MCP)或 supabase db query(CLI)。这些直接在数据库上运行 SQL,不创建迁移历史条目,因此可以自由迭代,并在准备好时生成干净的迁移。
不要使用 apply_migration 更改本地数据库 schema——它每次调用都会写入迁移历史条目,意味着无法迭代,且 supabase db diff / supabase db pull 会产生空或冲突的 diff。若使用它,你将受困于首次尝试时传入的 SQL。
准备好将变更提交到迁移文件时:
- 运行 advisors → supabase db advisors(CLI v2.81.3+)或 MCP get_advisors。修复任何问题。
- 若变更涉及视图、函数、触发器或存储,请回顾上述安全清单。
- 生成迁移 → supabase db pull <descriptive-name> --local --yes
- 验证 → supabase migration list --local
参考指南
技能反馈 → references/skill-feedback.md 当用户报告本技能给出错误指导或缺少信息时,必须阅读。