Как подключить MCP-сервер Supabase к Claude Code
Supabase подключается к Claude Code одной командой через хостируемый MCP-сервер: OAuth или personal access token, project_ref, read_only и какие инструменты разрешить.

У Supabase есть хостируемый MCP-сервер по адресу
https://mcp.supabase.com/mcp, и Claude Code начинает с ним работать после
одной команды. Локально ничего ставить не нужно. Ниже короткая версия:
команда, два способа авторизации, три параметра в URL, которые делают
подключение безопасным, и правила разрешений, которыми пользуюсь я. Это
«половина про Supabase» из статьи про три сервера,
на которых держится Council; про RevenueCat
есть отдельный текст.
Добавляем сервер
claude mcp add --scope project --transport http supabase \
"https://mcp.supabase.com/mcp?project_ref=<your-project-ref>&read_only=true"
--scope project записывает сервер в .mcp.json в корне репозитория, так
что его получает каждая сессия в этом репозитории и каждый коллега. Здесь
это безопасно: в URL нет секретов. Файл получается таким:
{
"mcpServers": {
"supabase": {
"type": "http",
"url": "https://mcp.supabase.com/mcp?project_ref=<your-project-ref>&read_only=true"
}
}
}
Project ref — короткий идентификатор из адреса проекта в дашборде Supabase:
https://supabase.com/dashboard/project/<your-project-ref>.
OAuth или personal access token
OAuth работает по умолчанию. Хостируемый сервер использует динамическую
регистрацию клиента, поэтому ни OAuth-приложение создавать, ни токен хранить
не нужно. Внутри Claude Code выполните /mcp, выберите supabase, нажмите
Authenticate: откроется браузер, где нужно войти и выбрать организацию, в
которой живёт проект. Документация Supabase советует делать это из обычного
терминала, а не из расширения для IDE; у меня так и было.
Personal access token нужен в CI и в клиентах без поддержки OAuth.
Создайте его на странице https://supabase.com/dashboard/account/tokens,
ограничьте одним проектом и передайте заголовком:
claude mcp add --transport http supabase \
"https://mcp.supabase.com/mcp?project_ref=<your-project-ref>&read_only=true" \
--header "Authorization: Bearer sbp_..."
В этом варианте --scope project не используйте: этот scope пишет в
.mcp.json, который рассчитан на коммит, и токен уехал бы в репозиторий
вместе с ним.
В npm по-прежнему лежит пакет @supabase/mcp-server-supabase для
self-hosting и AI SDK, но для Claude Code документация описывает именно
хостируемый сервер, и начинать я бы советовал с него.
Три параметра, которые стоит задать
project_refограничивает сервер одним проектом и отключает инструменты уровня аккаунта (list_projects,create_project,pause_project). Без него ассистент видит все проекты организации. Я веду несколько продуктов из соседних папок, и для меня это разница между доступом к одной базе и доступом ко всем.read_only=trueвыполняет каждый запрос от имени Postgres-пользователя только для чтения. Запись не проходит на уровне базы, а не на уровне промпта.featuresограничивает группы инструментов, через запятую:features=database,docs,debuggingхватает для большинства сессий.
Как проверить, что всё работает
Попросите что-нибудь, что только читает:
Какие таблицы есть в базе и есть ли индекс по
anon_id?
Claude Code должен вызвать list_tables и ответить по живой схеме. Если он
отвечает по файлу миграции, сервер не подключён: причину покажет /mcp.
Что он умеет
| Группа | Примеры инструментов | По умолчанию |
|---|---|---|
| Database | list_tables, list_migrations, apply_migration, execute_sql |
включена |
| Debugging | query_logs, get_advisors |
включена |
| Development | get_project_url, get_publishable_keys, generate_typescript_types |
включена |
| Edge Functions | list_edge_functions, deploy_edge_function |
включена |
| Docs | search_docs |
включена |
| Account | list_projects, create_project, get_cost |
выключена при project_ref |
| Branching | create_branch, merge_branch |
экспериментальная, платные планы |
| Storage | list_storage_buckets, update_storage_config |
выключена |
В Council больше всего пользы принесла группа Debugging. get_advisors
находит таблицы без политик row-level security, а через query_logs я нашёл
причину падавшего в продакшене вебхука RevenueCat: ошибка была в логе
Postgres, а не в логе приложения. Второй выигрыш — проверка дрейфа схемы.
Вопрос «совпадает ли задеплоенная схема с файлами миграций» ловит ошибки,
которые раньше я находил, только когда уже что-то подозревал.
Чтение разрешить, запись пусть спрашивает
MCP-инструменты проходят через обычную систему разрешений Claude Code. В
.claude/settings.json у Council инструменты чтения работают без
подтверждения:
{
"permissions": {
"allow": [
"mcp__supabase__list_tables",
"mcp__supabase__list_migrations",
"mcp__supabase__get_advisors",
"mcp__supabase__search_docs"
]
}
}
execute_sql и apply_migration по-прежнему спрашивают, даже в режиме
только для чтения: я хочу видеть запрос до того, как он выполнится.
Не подключайте продакшен без read_only
Сервер действует с вашими правами разработчика, поэтому это внутренний
инструмент, а не то, с чем общается конечный пользователь. Отсюда две
привычки. В интерактивной работе подключайтесь к продакшену только когда
задача этого требует, с заданными project_ref и read_only=true, и
оставляйте ручное подтверждение для всего, что пишет. Для автоматических
сценариев заранее разрешайте только инструменты чтения, ограниченные одним
проектом, и пусть они выдают рекомендации, а не вносят изменения. Причина —
prompt injection: текст, который читает ассистент, будь то тикет в поддержку
или строка в таблице, может попытаться уговорить его выполнить запрос.
Postgres-пользователь только для чтения — страховка на случай, когда промпт
не справился.
Изменения схемы сначала живут в ветке для разработки или в отдельном проекте и попадают в продакшен миграцией, которую вы прочитали.