为你的 Supabase 应用打造专属 MCP 服务器

为你的 Supabase 应用打造专属 MCP 服务器

💡 原文英文,约1100词,阅读约需4分钟。
📝

内容提要

Supabase 推出 MCP Server 模块,开发者可将应用功能封装为 MCP 工具,供用户在 ChatGPT、Claude 等客户端直接使用。借助 Supabase Auth 的 OAuth 流程,每次工具调用均以该用户身份执行,并由 RLS 策略控制数据访问。该模块提供含认证中间件和示例工具的 Edge Function 代码,开发者可自定义工具逻辑,并通过 MCP Apps 在对话中嵌入应用 UI。

🔎

延伸解读

身份与权限:每次调用都代表用户

文章强调,MCP 服务器通过 Supabase Auth 的 OAuth 流程获取用户令牌,后续工具调用均携带该令牌。中间件 withSupabase({ auth: 'user' }) 会验证令牌并提供用户身份的 Supabase 客户端,因此数据库查询自动受 RLS 策略约束。这意味着开发者无需在工具中手动检查权限,但必须确保 RLS 策略正确配置,否则可能暴露或限制数据。

工具设计:复用业务逻辑而非重写

文章建议工具应围绕应用已有操作构建,例如查询待办事项或调用数据库函数。工具内应调用与主应用相同的业务规则代码,如费用审批检查,避免逻辑分叉。示例中 list_open_tasks 工具直接使用用户客户端查询 RLS 保护的表,并返回 JSON 文本。开发者需自行定义输入 schema 和返回内容,保持工具简洁且与现有 API 一致。

部署前提:OAuth 与 JWT 配置调整

要让外部 MCP 客户端连接,需在 Supabase 项目中启用非对称签名密钥和 OAuth 2.1 服务器,并开启动态客户端注册。前端需添加 OAuth 同意页面,并将 Auth Site URL 指向该页面。Edge Function 需关闭内置 JWT 检查(verify_jwt = false),以便无令牌的发现请求能到达中间件。这些步骤是工具调用前必须完成的配置。

UI 嵌入:MCP Apps 的适用场景

文章介绍 MCP Apps 扩展允许在对话中展示应用 UI,例如 Sizzle 演示中的产品卡片和视频播放器。UI 复用 React 组件并打包为单个 HTML 文件,随工具结果返回。这适合希望用户在代理内直接交互的场景。若用户主要通过代理使用应用,Headless App 块提供了包含登录、同意流程和示例工具的起点,可减少前端开发工作。

❓

Q&A

Supabase 的 MCP Server 模块是什么?它主要解决什么问题?

Supabase 推出的 MCP Server 模块允许开发者将 Supabase 应用的功能封装为 MCP 工具,使用户能在 ChatGPT、Claude 等 MCP 客户端中直接使用这些工具。它解决了让用户在自己熟悉的 AI 工作流中访问应用功能的问题,同时通过 Supabase Auth 的 OAuth 流程确保每次工具调用都以该用户身份执行,并由 RLS 策略控制数据访问。

如何为我的 Supabase 项目添加 MCP 服务器代码?

通过 Supabase Library 安装 MCP Server 块:运行命令 `npx shadcn@latest add https://supabase.com/library/r/mcp.json`。该命令会将一个 Edge Function 复制到 `supabase/functions/mcp`,其中包含 MCP 处理器、认证中间件和一个用于检查调用者身份的 `whoami` 工具。每个工具都有独立文件,并在 `tools/index.ts` 中注册。

MCP 工具调用时如何确保以用户身份执行并遵守 RLS 策略?

认证中间件 `withOAuthProtectedResource()` 会告知客户端 OAuth 服务器的位置,用户通过应用登录并授权后,Supabase Auth 颁发访问令牌。后续工具调用携带该令牌,`withSupabase({ auth: 'user' })` 验证令牌并提供该用户的 Supabase 客户端。通过该客户端执行的查询会以用户身份运行,因此 Postgres 会自动应用表的 RLS 策略。

如何编写一个 MCP 工具?能举个例子吗?

每个工具模块接收 MCP 服务器实例(`server`)和调用者的 Supabase 客户端(`supabase`)。使用 `server.registerTool` 注册工具,指定名称、描述、输入模式(用 Zod 定义)和异步处理函数。例如,一个列出未完成任务的工具可以查询 `todos` 表,筛选 `done = false` 并限制 20 条,返回 JSON 文本内容。工具逻辑可以调用数据库函数、Edge Function 或现有应用 API,业务规则应放在被调用的代码中。

MCP Apps 是什么?它如何让应用 UI 嵌入对话中?

MCP Apps 是 MCP 的扩展,允许 MCP 工具在聊天中显示应用的部分 UI。支持该扩展的客户端(如 ChatGPT)会在对话内展示 UI。例如,在 Sizzle 演示中,用户请求产品时,ChatGPT 会显示产品卡片和视频播放器;请求新广告时,广告会在同一聊天中渲染。UI 复用 React 组件,通过单独构建打包成一个 HTML 文件,由 Edge Function 随工具结果发送。

配置 MCP 服务器以连接外部代理需要哪些步骤?

需要:1) 为 Supabase 项目配置非对称签名密钥并开启 OAuth 2.1 服务器;2) 开启动态客户端注册,以便兼容客户端自行注册;3) 在前端添加 OAuth Consent 块,让用户批准访问;4) 将 Auth Site URL 设置为托管同意页面的站点;5) 在 Edge Function 中间件中验证令牌,并关闭内置 JWT 检查(设置 `verify_jwt = false`),以便无令牌的发现请求能到达。最后,用户将代理连接到部署的服务器 URL。

🏷️

标签

➡️

继续阅读