На конференции Supabase Select мы анонсировали способ предоставить вашему приложению Supabase собственный MCP-сервер. Ваши клиенты смогут использовать ваше приложение из ChatGPT, Claude или другого MCP-клиента. Они входят в систему с помощью уже имеющейся у них учетной записи. Каждый вызов инструмента выполняется от имени этого пользователя, поэтому ваши политики RLS определяют, к чему может обратиться каждый агент.
Вы предоставляете возможности своего приложения в качестве инструментов с помощью протокола Model Context Protocol (MCP).
Блок MCP Server добавляет код сервера в ваш проект. Supabase Auth управляет процессом OAuth. Вспомогательные функции из @supabase/server предоставляют каждому инструменту клиент Supabase для вошедшего в систему пользователя. Каждый инструмент может быть обычным запросом, без ключа роли сервиса. Вы пишите инструменты, которые подходят вашему приложению.
Посмотрите это в действии в докладе Грега Ричардсона (Greg Richardson) на Select. Общие анонсы читайте в статьях «Создавайте что угодно: Supabase из кода и MCP-сервер для вашего приложения» и в нашем обзоре Supabase Select 2026.
Допустим, ваше приложение превращает фотографии продуктов в видеорекламу. Клиент планирует кампанию в Claude. Ему нужны его продукты и инструменты рекламы в вашем приложении. С помощью MCP его агент может найти продукт, запросить рекламу и использовать результат в том же разговоре вместе с другими своими инструментами.
Именно этот сценарий мы показали с помощью Sizzle, демонстрационного приложения, на Supabase Select. Приложение использует Supabase Auth, Database и Storage. Его инструменты MCP позволяют клиенту выводить список своих продуктов и создавать видеорекламу через внешний сервис. Клиент может использовать эти действия из ChatGPT или Claude. Посмотрите полную демонстрацию.
Установите блок MCP Server из библиотеки Supabase:
_10
npx shadcn@latest add https://supabase.com/library/r/mcp.json
Команда копирует Edge Function в supabase/functions/mcp. Она включает обработчик MCP, промежуточное ПО (middleware) для аутентификации и инструмент whoami для проверки личности вызывающего абонента. Каждый инструмент имеет собственный файл, а tools/index.ts регистрирует их.
Вы владеете этим кодом. Добавляйте инструменты для операций, которые поддерживает ваш продукт, изменяйте их входные данные и решайте, какую информацию они возвращают. На странице блока в Библиотеке есть кнопка «Скопировать промпт для агента» (Copy agent prompt), которая указывает вашему агенту по кодированию на документацию блока.
Блок использует официальный TypeScript SDK для MCP для реализации протокола и регистрации инструментов. Вспомогательные функции Supabase управляют подключением к Supabase Auth и клиентской части пользователя.
Вспомогательные функции Supabase также работают в других бэкендах, использующих стандартные обработчики Web Request и Response, включая Cloudflare Workers, и с другими библиотеками MCP. Чтобы повторно использовать логику, которая запускается в другом месте, добавьте туда эндпоинт MCP и установите его общедоступный URL-адрес и URL-адрес Supabase Auth, чтобы клиенты могли найти правильный сервер Auth.
Агент клиента (MCP-клиент) начинается с URL-адреса вашего сервера. Промежуточное ПО аутентификации подсказывает ему, где найти OAuth-сервер вашего проекта. Пользователь входит в систему через ваше приложение и одобряет клиента на странице согласия. Затем Supabase Auth выдает токен доступа для этого пользователя.
Последующие вызовы инструментов несут этот токен.
В сгенерированной функции handleMcp является обработчиком запросов MCP. Вспомогательные функции аутентификации запускаются перед ним:
_15
import { pipeline } from 'npm:@supabase/middleware@1'
_15
import {
_15
withOAuthProtectedResource,
_15
withSupabase,
_15
} from 'npm:@supabase/server@1'
_15
_15
Deno.serve(
_15
pipeline(
_15
_15
withOAuthProtectedResource(),
_15
withSupabase({ auth: 'user' }),
_15
_15
handleMcp,
_15
_15
withOAuthProtectedResource() сообщает клиенту, где войти в систему. Он отвечает на запросы обнаружения и отправляет запрос OAuth, когда в запросе нет токена.
withSupabase({ auth: 'user' }) проверяет токен и предоставляет обработчику клиент Supabase пользователя. Запросы через этот клиент выполняются с идентификацией пользователя, поэтому Postgres применяет политики RLS для таблицы.
В руководстве по MCP-серверу подробно описаны промежуточное ПО и обработка запросов.
Каждый модуль инструмента получает MCP-сервер как server, а клиент Supabase вызывающего абонента как supabase. z — это построитель схем Zod. Инструмент для существующей защищенной с помощью RLS таблицы todos может выводить список незавершенных задач:
_23
server.registerTool(
_23
'list_open_tasks',
_23
_23
description: 'Find up to 20 unfinished tasks for the signed-in user.',
_23
inputSchema: z.object({}),
_23
annotations: { readOnlyHint: true },
_23
_23
async () => {
_23
const result = await supabase
_23
.from('todos')
_23
.select('id, title')
_23
.eq('done', false)
_23
.limit(20)
_23
_23
if (result.error) throw new Error(result.error.message)
_23
_23
return {
_23
content: [
_23
{ type: 'text', text: JSON.stringify(result.data) },
_23
_23
_23
_23
Инструмент фильтрует данные по статусу задачи. Ваши политики RLS определяют, к каким строкам этот пользователь может получить доступ.
Инструмент также может вызывать функцию базы данных, вызывать Edge Function или использовать существующий API приложения.
Храните бизнес-правила в коде, который вызывает инструмент. Например, для расхода может потребоваться проверка утверждения. Инструмент MCP должен вызывать ту же функцию, которую ваше приложение использует для этой проверки.
Ваши инструменты MCP могут отображать часть пользовательского интерфейса вашего приложения прямо в чате. Для этого используются MCP Apps — расширение для MCP. ChatGPT и другие поддерживающие его клиенты отображают пользовательский интерфейс внутри беседы.
В демонстрации Sizzle клиент просит ChatGPT показать один из своих продуктов. ChatGPT показывает карточку продукта Sizzle с описанием и видеоплеером. Когда клиент запрашивает новую рекламу, он наблюдает за ее рендерингом в том же чате.
Интерфейс повторно использует компоненты React из веб-приложения Sizzle. Отдельная сборка объединяет их в один файл HTML. Edge Function отправляет этот файл вместе с результатом работы инструмента.
Если люди в основном используют ваше приложение через агента, блок Headless App предоставляет еще одну отправную точку. Он включает в себя браузерный процесс для входа в систему и получения согласия, примеры инструментов задач и защищенную с помощью RLS базу данных. Пользователи одобряют доступ в браузере, а затем работают через своего агента.
Чтобы подключить внешние агенты, настройте свой проект Supabase с асимметричными ключами подписи и включите сервер OAuth 2.1. Включите динамическую регистрацию клиентов, чтобы совместимые клиенты могли регистрироваться самостоятельно.
Добавьте блок OAuth Consent на свой интерфейс, чтобы пользователи могли одобрять доступ. Установите для параметра Auth Site URL сайт, на котором размещена страница согласия.
Edge Function проверяет токены в своем промежуточном ПО. Отключите встроенную проверку JWT, чтобы запросы обнаружения без токена могли доходить до нее:
_10
[functions.mcp]
_10
verify_jwt = false
Пользователи подключают своего агента к развернутому URL-адресу сервера.
Следуйте руководству «Развертывание MCP-серверов» (Deploy MCP servers), чтобы ознакомиться с полной настройкой, локальным тестированием и шагами развертывания.










