はじめに
認証設計・DB設計・サーバーレス関数を個別に組み合わせる話ではない。Supabaseというオールインワンのバックエンドプラットフォームに公式MCPサーバーで接続し、Claude Codeが自然言語でデータベースを設計・操作・型生成するまでをフルに担う話だ。
Supabaseを使う開発で最も頻繁に発生する手間が「テーブル変更→supabase gen types実行→TypeScript型の更新」のサイクルだ。スキーマを変えるたびに手動でコマンドを実行し、生成された型をコードに反映させる。この作業自体は機械的だが、忘れると型とDBの定義が乖離してコンパイルエラーが後から発覚する。
Supabaseは2026年に公式MCPサーバー(supabase-community/supabase-mcp)をv0.7.0まで安定させ、Claude Codeとの公式統合として公認した。この統合により、スキーマ設計の会話の中でRLSポリシー生成・マイグレーションファイル作成・TypeScript型生成が一括で完結するようになった。
CLAUDE.mdでSupabase開発規約を定義する——「RLS必須・型再生成必須」をデフォルトに
セキュリティのデフォルト化
Supabaseで最もよく発生するセキュリティミスの一つが、新規テーブルにRLS(Row Level Security)を設定し忘れることだ。RLSが無効のテーブルはSupabaseデフォルトではpublicアクセスになる。「テーブルを追加したが後でRLSを忘れていたと気づいた」という問題を、CLAUDE.mdで構造的に防げる。
# CLAUDE.md(Supabase・データベース規約)
## Supabase Policy
### データベース設計
- 新規テーブルには必ずRLS(Row Level Security)を有効化すること(無効のままのテーブルは禁止)
- RLSポリシーはauth.uid()を使用してユーザーごとに分離する
- スキーマ変更後は必ずTypeScript型を再生成すること(MCPのgenerate_typesツールを使用)
- マイグレーションファイルはsupabase/migrations/に保存し、命名は YYYYMMDDHHMMSS_{description}.sql
### 認証設計
- 認証はSupabase Authを使用。独自JWTは原則禁止
- メール確認必須(email_confirmed_at IS NOT NULL でチェック)
- 管理者権限はauth.jwt()->>'role'でチェックする
### Edge Functions
- データベース直接アクセスはEdge Functionsを経由させる(クライアントから直接触れるのはRLS適用テーブルのみ)
- Denoランタイム。Node.js APIは使用不可
### 安全なMCP利用
- Supabase MCPは開発・ステージング環境のみ接続。本番環境への接続禁止
- read_onlyモードを基本とし、書き込み操作は明示的に承認してから実行する「スキーマ変更後は必ずTypeScript型を再生成する」という行をCLAUDE.mdに書くことで、Claude Codeはテーブルを追加・変更するたびに型生成も合わせて実行するようになる。コードとDBの型乖離がスキーマ変更の直後に検出されるようになる。
「Supabase MCPは開発・ステージング環境のみ」という定義も重要だ。Supabase公式ドキュメントはMCPサーバーを「開発・テスト目的のみ」として明示している。CLAUDE.mdにこれを定義することで、Claude Codeが本番プロジェクトへの接続を試みる設定を生成しなくなる。
Supabase MCPをClaude Codeに接続する——公式MCPサーバーの設定とツール群
MCPサーバーの設定
supabase-community/supabase-mcpはSupabase公式エコシステムが開発するMCPサーバーで、2026年にv0.7.0まで安定リリースが重ねられている。公式ブログ(supabase.com/blog/mcp-server)とAnthropicの公式プラグインページ(claude.com/plugins/supabase)に掲載されている公式統合だ。
.mcp.jsonへの設定はHTTP transport形式で行う。なお、"type": "http"フィールドを含む以下の形式が使用している環境で正確に動作するかは、Supabase公式ドキュメント(supabase.com/docs/guides/getting-started/mcp)で最新の設定形式を確認してほしい。設定形式は更新される可能性がある。
{
"mcpServers": {
"supabase": {
"type": "http",
"url": "https://mcp.supabase.com/mcp"
}
}
}プロジェクトをスコープ限定かつread_onlyにする場合はこうなる。
{
"mcpServers": {
"supabase": {
"type": "http",
"url": "https://mcp.supabase.com/mcp?project_ref=YOUR_PROJECT_REF&read_only=true"
}
}
} read_only=trueをデフォルトにしておくことを強く推奨する。書き込み操作が必要なときのみ明示的にオフにする運用をCLAUDE.mdで定義しておけば、「Claude Codeが誤って意図しないデータを削除した」という事故を設計段階で防げる。
初回接続時はブラウザへリダイレクトしてSupabaseアカウントへのOAuth認証が走る。Personal Access Token(PAT)を発行して直接設定する方法も選択できる。
提供するツールのカテゴリ
SupabaseのMCPサーバーはClaude Codeに多数のツールを提供している。主なカテゴリは以下の通りだ。
| カテゴリ | 代表ツール | 用途 |
|---------|-----------|------|
| Database | execute_sql, list_tables | SQL実行・テーブル一覧 |
| Development | TypeScript型生成 | スキーマからの型自動生成 |
| Branching(実験的) | DB分岐作成・マージ | 安全な開発環境分離 |
| Debugging | ログ取得・Advisors | パフォーマンス問題の特定 |
| Edge Functions | デプロイ | Edge Functions管理 |
| Account | プロジェクト管理 | プロジェクト作成・一時停止 |
スキーマ設計・RLSポリシー・型生成——自然言語指示の実践フロー
テーブル追加からRLS・マイグレーション・型生成を1つの指示で完結させる
Supabase MCPが接続された状態での指示パターンはこうなる。
「usersテーブルにprofilesテーブルを追加して。
フィールド: id(UUID, PK, auth.users参照), username(text, unique),
avatar_url(text, nullable), created_at(timestamptz)
RLSを有効化して:
- SELECT: 全ユーザーが閲覧可能
- UPDATE: 自分のプロフィールのみ更新可能(auth.uid() = id)
マイグレーションファイルも作成して、TypeScript型も生成して」 この1つの指示で、テーブル定義のSQL・RLSポリシーの設定・supabase/migrations/へのマイグレーションファイル保存・TypeScript型の再生成が連続して実行される。
SupabaseはClaude Code向けにRLSポリシー生成の公式AIプロンプトガイドを提供している。auth.uid()・auth.jwt()の正しい使い方・SECURITY INVOKERを使ったデータベース関数のベストプラクティスが定義されており、Claude Codeがこれに沿ったポリシーを生成できる。RLSのSQL構文は複雑になりやすいが、「自分のデータのみ閲覧可能」「管理者は全てのデータにアクセス可能」といった要件を自然言語で伝えるだけで、適切なポリシーが生成される。
データベースブランチングで安全なスキーマ変更ワークフロー
データベースブランチングは現時点で実験的(experimental)な機能であり、料金プランによっては利用できない場合がある。その点を踏まえた上で、この機能が利用できる環境では以下のフローが実現する。
「todosテーブルにpriorityカラムを追加したい。
開発ブランチを作成→マイグレーション適用→動作確認→本番マージ
という安全なフローで進めて」 Claude Codeはこの指示に対して、create_branchでDev DBブランチを作成し、ALTER TABLE todos ADD COLUMN priority int2 DEFAULT 1のマイグレーションSQLを適用し、型生成・動作確認を経て、問題なければ本番へのマージを実行する。データベースのスキーマ変更がGitのブランチ操作と同じように扱えるため、「AIが生成したマイグレーションを本番で初めて実行する」というリスクが消える。
この機能は実験段階であることを認識した上で、利用可能なプランの場合には積極的に活用する価値がある。
既存コードのRLSレビュー
既にテーブルが多数あるプロジェクトに対して、「全テーブルのRLS設定状況を確認して、無効になっているテーブルをリストアップして」と依頼することで、セキュリティ上の問題がある箇所を一覧化できる。その後「このテーブルにCLAUDE.mdのRLSポリシー規約に従ったポリシーを追加して」と続けることで、漏れていたRLS設定を順番に補完していける。
まとめ
SupabaseとClaude Codeの組み合わせで最も効果が出るのは、「スキーマを変えたら型も変える」という機械的なサイクルの自動化と、RLSポリシーの設計だ。どちらも手動で対応できる作業だが、忘れたときのコストが高い——型乖離はコンパイルエラーの原因になり、RLS設定漏れはセキュリティ問題に直結する。
CLAUDE.mdの「RLS全テーブル必須化」と「スキーマ変更後の型再生成必須」を定義することで、Claude Codeがこれらを「デフォルトの行動」として実行するようになる。read_only=trueを基本設定にしてMCPの書き込み操作を明示的に制御することで、会話の流れで意図しないDB変更が走るリスクも抑えられる。
まず試すなら、.mcp.jsonにSupabase MCPをread_onlyで設定し、「現在のプロジェクトのテーブル一覧とRLS設定状況を確認して」と依頼することから始めてほしい。現状のセキュリティ設定が可視化されるだけで、すぐに着手すべき改善が見えてくる。

コメント