互联网

Supabase:给每个应用配一个自带 MCP 服务器,工具调用以登录用户身份运行

来源:Supabase    作者:Supabase      2026年10月23日 15:16

导语:在 Supabase Select 大会上,我们宣布了一种让你的 Supabase 应用拥有自己 MCP 服务器的方式。

摘要

Supabase 在 Select 大会上宣布:开发者可以为自己的 Supabase 应用生成专属 MCP 服务器,客户因此能直接从 ChatGPT、Claude 或任何 MCP 客户端使用这个应用,并用其在该应用已有的账号登录。关键在于每一次工具调用都以该用户身份执行,由应用自身的 RLS(行级安全)策略决定智能体能触达哪些数据,权限模型无需为智能体另建一套。文章给出从安装 MCP Server 代码块、用 OAuth 中间件携带用户身份、到围绕应用既有操作编写工具模块的做法,以及把应用 UI 直接嵌进聊天界面的 MCP Apps 扩展。

正文(译文)

在 Supabase Select 大会上,我们宣布了一种让你的 Supabase 应用拥有自己 MCP 服务器的方式。你的客户可以从 ChatGPT、Claude 或其他 MCP 客户端使用你的应用,用他们已有的账号登录。每一次工具调用都以该用户身份运行,于是你的 RLS 策略决定每个智能体能触达什么。

你通过模型上下文协议(MCP)把应用的动作暴露为工具。MCP Server 代码块会把服务器代码加入你的项目;Supabase Auth 处理 OAuth 流程;来自 @supabase/server 的辅助函数给每个工具一个面向已登录用户的 Supabase 客户端。每个工具可以是一个普通查询,无需 service role 密钥。你编写适合自己应用的工具。

在 Greg Richardson 的 Select 演讲中看它实际运行;更全面的发布内容见 Build anything: Supabase from code、以及 Supabase Select 2026 回顾。

你的应用,进到客户的 workflow 里 假设你的应用把产品照片转成视频广告。一位客户正在 Claude 里规划一场营销活动,需要用到他的产品和你的广告工具。通过 MCP,他的智能体能找到某个产品、申请一支广告,并在同一段对话里(连同他的其他工具)使用结果。

这就是我们在 Select 上用演示应用 Sizzle 展示的流程。该应用用了 Supabase Auth、Database 与 Storage;它的 MCP 工具让客户列出自己的产品、并通过外部服务生成视频广告。客户能从 ChatGPT 或 Claude 使用这些动作。看完整演示。

从你拥有的代码开始 从 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 负责注册它们。

你拥有这段代码。可以为你的产品支持的操作添加工具、改它们的输入、决定返回什么信息。该代码块的 Library 页面有一个"复制 agent 提示"按钮,把你的编码智能体指向代码块文档。

该代码块使用官方的 MCP TypeScript SDK 做协议与工具注册;Supabase 的辅助函数负责连接 Supabase Auth 与用户客户端。这些辅助函数也能用在其他使用标准 Web Request/Response 处理器的后端里(包括 Cloudflare Workers),也能搭配其他 MCP 库。要在别处复用逻辑,就在那里加上 MCP 端点,并设置其公开 URL 与你的 Supabase Auth URL,让客户端能找到正确的 Auth 服务器。

把用户身份带进每一次调用 客户的智能体(MCP 客户端)从你的服务器 URL 起步。认证中间件告诉它去哪里找你项目的 OAuth 服务器;用户通过你的应用登录,并在你的同意页上批准该客户端。Supabase Auth 随后为该用户签发访问令牌。之后的工具调用都携带这个令牌。

在生成的函数的 handleMcp(MCP 请求处理器)之前,会先运行认证辅助函数。处理器逻辑大致如下(Deno 服务端示例): 先 import 来自 npm:@supabase/middleware@1 的 pipeline,以及来自 npm:@supabase/server@1 的 withOAuthProtectedResource 与 withSupabase; 然后用 Deno.serve 包住 pipeline,pipeline 内依次放入 withOAuthProtectedResource()、withSupabase({ auth: 'user' }) 与 handleMcp。 其中 withOAuthProtectedResource() 告诉客户端去哪里登录:它应答发现请求,并在请求无令牌时发起 OAuth 挑战;withSupabase({ auth: 'user' }) 校验令牌,并向处理器提供该用户的 Supabase 客户端。经该客户端发起的查询以用户身份运行,于是 Postgres 会套用该表的 RLS 策略。MCP 服务器指南详细解释了中间件与请求处理。

围绕应用的动作编写工具 每个工具模块拿到 server(MCP 服务器)与 supabase(调用方的 Supabase 客户端)。z 是 Zod 的 schema 构建器。一个面向既有的、受 RLS 保护的 todos 表的工具,可以列出未完成任务,逻辑大致如下(工具注册示例): server.registerTool 注册名为 list_open_tasks 的工具;描述为"为已登录用户查找最多 20 条未完成任务";inputSchema 用 z.object({});annotations 标记 readOnlyHint 为真;异步函数里用 supabase 从 todos 表 select id 与 title,条件是 done 为假,limit 20;若出错则抛出错误;返回 content 里放 JSON 化的结果数据。

该工具按任务状态过滤,而你的 RLS 策略决定该用户能触达哪些行。一个工具也可以调用数据库函数、调用 Edge Function,或使用既有的应用 API。把业务规则留在工具所调用的代码里——例如一笔费用可能需要审批检查,MCP 工具应当调用你的应用做该检查时用的同一函数。

在智能体里加一个界面 你的 MCP 工具可以把应用的部分 UI 直接显示在聊天里,这用到 MCP Apps(MCP 的一个扩展),支持它的客户端(如 ChatGPT)会在对话内展示该 UI。在 Sizzle 演示中,客户向 ChatGPT 索要自己的某个产品,ChatGPT 展示 Sizzle 的产品卡(含描述与视频播放器);当客户要一支新广告,就在同一聊天里看着它渲染出来。

该 UI 复用了 Sizzle Web 应用的 React 组件,一个单独的构建把它们打包成一个 HTML 文件,Edge Function 把该文件随工具结果一起发出。如果用户主要通过智能体用你的应用,Headless App 代码块提供了另一个起点:它内含浏览器登录与同意流程、示例任务工具,以及一个受 RLS 保护的数据库;用户在浏览器里批准访问,再经其智能体工作。

开始使用 要连接外部智能体,用非对称签名密钥配置你的 Supabase 项目,并开启 OAuth 2.1 服务器;开启动态客户端注册,让兼容客户端能自行注册。把 OAuth Consent 代码块加进前端,让用户能批准访问;把你的 Auth Site URL 设为托管同意页的站点。Edge Function 在其中间件里校验令牌;关闭内置的 JWT 检查,让无令牌的发现请求能到达它,配置项如下: [functions.mcp] 段下 verify_jwt = false 用户把他们的智能体连接到已部署的服务器 URL。完整配置、本地测试与部署步骤见 Deploy MCP servers 指南。


(文章为作者独立观点,不代表艾瑞网立场)
  • 合作伙伴

  • 官方微信
    官方微信

    新浪微博
    邮件订阅
    第一时间获取最新行业数据、研究成果、产业报告、活动峰会等信息。
     关于艾瑞| 业务体系| 加入艾瑞| 服务声明| 信息反馈| 联系我们| 合作伙伴| 友情链接

Copyright© 沪公网安备 31010402000581号沪ICP备15021772号-10

扫一扫,或长按识别二维码

关注艾瑞网官方微信公众号