Self-Hosted Supabase MCP Server について
Self-Hosted Supabase MCP Server は、セルフホスト可能な Supabase インスタンス向けの MCP サーバーです。開発環境からスキーマ、マイグレーション、認証ユーザーを確認できます。クラウド版のマルチプロジェクト機能を省き、単一プロジェクトに絞った実装です。
主な機能
- 01スキーマ、拡張機能、インデックスの参照
- 02マイグレーションの一覧表示と適用
- 03認証ユーザーの作成、取得、更新、削除
- 04Storage のバケットとオブジェクトの管理
- 05HTTP モードでのロールに基づくツール制御
- 06HTTP と stdio の transport 対応
活用シーン
- 01IDE からテーブル、インデックス、外部キーを確認する
- 02接続状況、統計情報、RLS ポリシーを調べる
- 03セルフホスト環境のスキーマから TypeScript 型を生成する
MCP 対応
本プロジェクトは MCP サーバーとして、データベース、認証、ストレージに関するツールを MCP クライアントに提供します。HTTP モードでは JWT の role クレームによって利用可能なツールが決まります。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
セルフホスト Supabase MCP サーバー
概要
このプロジェクトは、セルフホスト Supabase インスタンスとの連携に特化した Model Context Protocol(MCP) サーバーを提供します。MCP クライアント(IDE 拡張機能など)と、ローカルまたはプライベートにホストされた Supabase プロジェクトとの間をつなぎ、開発環境から直接、データベースの調査、管理、操作を可能にします。
このサーバーは、公式 Supabase クラウド MCP サーバーを適応する過程で得た知見を活かし、セルフホスト用途に合わせた、最小限で用途を絞った実装として一から構築されました。
目的
このサーバーの主な目的は、セルフホスト Supabase を使用する開発者が、次のようなタスクに MCP ベースのツールを活用できるようにすることです。
- データベースのスキーマとデータを照会する。
- データベースのマイグレーションを管理する。
- データベースの統計情報と接続を調査する。
- 認証ユーザーを管理する。
- Supabase Storage を操作する。
- 型定義を生成する。
マルチプロジェクト管理やクラウド固有の API に関する公式クラウドサーバーの複雑さを避け、単一プロジェクトのセルフホスト環境に適した、シンプルな利用体験を提供します。
機能(実装済みのツール)
ツールは権限レベルごとに分類されています。
- 一般ツールは、認証済みの Supabase JWT(
authenticatedまたはservice_roleロール)を持つすべてのユーザーが利用できます。 - 特権ツールには、
service_roleJWT(HTTP モード)、またはデータベース/サービスキーへの直接アクセス(stdio モード)が必要です。
スキーマとマイグレーション
| ツール | 説明 | 権限 |
|---|---|---|
list_tables | データベーススキーマ内のテーブルを一覧表示します | 一般 |
list_extensions | インストール済みの PostgreSQL 拡張機能を一覧表示します | 一般 |
list_available_extensions | 利用可能(インストール可能)な拡張機能をすべて一覧表示します | 一般 |
list_migrations | supabase_migrations.schema_migrations に記録された適用済みマイグレーションを一覧表示します | 一般 |
apply_migration | SQL マイグレーションを適用し、supabase_migrations.schema_migrations に記録します | 特権 |
list_table_columns | 特定のテーブルの列を一覧表示します | 一般 |
list_indexes | 特定のテーブルのインデックスを一覧表示します | 一般 |
list_constraints | 特定のテーブルの制約を一覧表示します | 一般 |
list_foreign_keys | 特定のテーブルの外部キーを一覧表示します | 一般 |
list_triggers | 特定のテーブルのトリガーを一覧表示します | 一般 |
list_database_functions | ユーザー定義のデータベース関数を一覧表示します | 一般 |
get_function_definition | 関数のソース定義を取得します | 一般 |
get_trigger_definition | トリガーのソース定義を取得します | 一般 |
データベース操作と統計情報
| ツール | 説明 | 権限 |
|---|---|---|
execute_sql | 任意の SQL クエリを実行します | 特権 |
explain_query | クエリに対して EXPLAIN ANALYZE を実行します | 特権 |
get_database_connections | アクティブな接続(pg_stat_activity)を表示します | 一般 |
get_database_stats | データベースの統計情報(pg_stat_*)を取得します | 一般 |
get_index_stats | インデックスの使用状況に関する統計情報を表示します | 一般 |
get_vector_index_stats | pgvector インデックスの統計情報を表示します | 一般 |
セキュリティと RLS
| ツール | 説明 | 権限 |
|---|---|---|
list_rls_policies | テーブルの行レベルセキュリティポリシーを一覧表示します | 一般 |
get_rls_status | テーブルの RLS が有効か無効かを表示します | 一般 |
get_advisors | セキュリティとパフォーマンスに関するアドバイザリ通知を取得します | 一般 |
プロジェクト設定
| ツール | 説明 | 権限 |
|---|---|---|
get_project_url | 設定されている Supabase URL を返します | 通常 |
verify_jwt_secret | JWT シークレットが設定されているか確認します | 通常 |
開発・拡張ツール
| ツール | 説明 | 権限 |
|---|---|---|
generate_typescript_types | データベーススキーマから TypeScript 型を生成します | 通常 |
rebuild_hooks | pg_net ワーカーを再起動します(使用している場合) | 特権 |
get_logs | 最近のログエントリーを取得します(分析スタックまたは CSV フォールバック) | 通常 |
認証ユーザー管理
| ツール | 説明 | 権限 |
|---|---|---|
list_auth_users | auth.users のユーザー一覧を表示します | 通常 |
get_auth_user | 特定のユーザーの詳細を取得します | 通常 |
create_auth_user | auth.users に新しいユーザーを作成します(パスワードは pgcrypto で bcrypt ハッシュ化) | 特権 |
update_auth_user | ユーザーの詳細を更新します(パスワードを変更した場合は bcrypt ハッシュ化) | 特権 |
delete_auth_user | auth.users からユーザーを削除します | 特権 |
ストレージ
| ツール | 説明 | 権限 |
|---|---|---|
list_storage_buckets | すべてのストレージバケットを一覧表示します | 通常 |
list_storage_objects | 特定のバケット内のオブジェクトを一覧表示します | 通常 |
get_storage_config | ストレージバケットの設定を取得します | 通常 |
update_storage_config | ストレージバケットの設定を更新します | 特権 |
Realtime の検査
| ツール | 説明 | 権限 |
|---|---|---|
list_realtime_publications | PostgreSQL のパブリケーション(例:supabase_realtime)を一覧表示します | 通常 |
拡張機能固有のツール
| ツール | 説明 | 権限 |
|---|---|---|
list_cron_jobs | スケジュール済みジョブを一覧表示します(pg_cron 拡張機能が必要) | 通常 |
get_cron_job_history | cron ジョブの最近の実行履歴を表示します | 通常 |
list_vector_indexes | pgvector インデックスを一覧表示します(pgvector 拡張機能が必要) | 通常 |
Edge Functions
| ツール | 説明 | 権限 |
|---|---|---|
list_edge_functions | デプロイ済みの Edge Functions を一覧表示します | 通常 |
get_edge_function_details | Edge Function の詳細とメタデータを取得します | 通常 |
list_edge_function_logs | Edge Function の最近のログを取得します | 通常 |
supabase_migrations.schema_migrations について
list_migrations ツールと apply_migration ツールは、supabase_migrations.schema_migrations テーブルに依存します。このテーブルは Supabase CLI によって作成・管理されます。MCP サーバー自体の一部ではありません。
テーブルの作成方法:
Supabase CLI を使って初期化するか、マイグレーションを実行すると、テーブルが自動的に作成されます:
supabase db push # pushes local migrations to a remote database
supabase migration up # applies pending local migration files
データベースに対して Supabase CLI を一度も実行したことがない場合、テーブルは存在せず、list_migrations はエラーを返します。次のコマンドで手動作成できます:
CREATE SCHEMA IF NOT EXISTS supabase_migrations;
CREATE TABLE IF NOT EXISTS supabase_migrations.schema_migrations (
version text NOT NULL PRIMARY KEY,
name text NOT NULL DEFAULT '',
inserted_at timestamptz NOT NULL DEFAULT now()
);
公式 Supabase とのスキーマの違い:
Supabase クラウドプラットフォームでは、追加の列(例:statements、dirty)が管理されています。この MCP サーバーは、Supabase CLI のローカル開発ワークフローと互換性のある最小限のスキーマ(version + name + inserted_at)を使用します。既存のテーブルに追加の列がある場合、それらは無視されます。
セットアップとインストール
Smithery 経由でのインストール
Smithery 経由で Self-Hosted Supabase MCP Server for Claude Desktop を自動的にインストールするには:
npx -y @smithery/cli install @HenkDz/selfhosted-supabase-mcp --client claude
前提条件
- Bun v1.1 以降(Node.js/npm の代わりに使用。ランタイムとビルドに使用)
- セルフホスト型 Supabase インスタンスへのアクセス(URL、キー、および必要に応じて直接接続用の PostgreSQL 接続文字列)。
手順
- リポジトリをクローンします:
git clone <repository-url> cd selfhosted-supabase-mcp - 依存関係をインストールします:
bun install - プロジェクトをビルドします:
これにより、TypeScript ソースがコンパイルされ、bun run builddistディレクトリに JavaScript が生成されます。
設定
サーバーには、Supabase インスタンスの設定情報が必要です。これらはコマンドライン引数または環境変数で指定できます。CLI 引数が優先されます。
必須:
--url <url>またはSUPABASE_URL=<url>:Supabase プロジェクトのメイン HTTP URL(例:http://localhost:8000)。--anon-key <key>またはSUPABASE_ANON_KEY=<key>:Supabase プロジェクトの匿名キー。
任意(ただし、推奨/特定のツールでは必須):
--service-key <key>またはSUPABASE_SERVICE_ROLE_KEY=<key>:Supabase プロジェクトのサービスロールキー。特権ツール、および起動時にexecute_sqlヘルパー関数を自動作成するために必要です。--db-url <url>またはDATABASE_URL=<url>:Supabase データベースへの直接 PostgreSQL 接続文字列(例:postgresql://postgres:password@localhost:5432/postgres)。データベースへの直接アクセスが必要なツール(apply_migration、Auth ツール、Storage ツール、pg_catalogクエリ)に必要です。--jwt-secret <secret>またはSUPABASE_AUTH_JWT_SECRET=<secret>:Supabase プロジェクトの JWT シークレット。--transport httpの使用時、およびverify_jwt_secretツールに必要です。--tools-config <path>:有効にするツールを指定する JSON ファイルのパス(許可リスト)。省略した場合、すべてのツールが有効になります。形式:{"enabledTools": ["tool_name_1", "tool_name_2"]}。
HTTP トランスポートのオプション(--transport http の使用時):
--port <number>:HTTP サーバーのポート(デフォルト:3000)。--host <string>:HTTP サーバーのホスト(デフォルト:127.0.0.1)。--cors-origins <origins>:許可する CORS オリジンのカンマ区切りリスト。デフォルトでは localhost のみです。--rate-limit-window <ms>:レート制限ウィンドウのミリ秒数(デフォルト:60000)。--rate-limit-max <count>:レート制限ウィンドウあたりの最大リクエスト数(デフォルト:100)。--request-timeout <ms>:リクエストのタイムアウト時間(ミリ秒、デフォルト:30000)。
重要な注意事項:
execute_sqlヘルパー関数: 多くのツールは、RPC 経由で SQL を実行するために、Supabase データベース内のpublic.execute_sql関数を利用します。サーバーは起動時にこの関数の有無を確認します。関数が存在せず、かつservice-keyとdb-urlが指定されている場合は、自動作成を試みます。作成に失敗した場合、またはキーが指定されていない場合、RPC のみを利用するツールは失敗することがあります。- データベースへの直接アクセス: 特権スキーマ(
auth、storage)またはシステムカタログ(pg_catalog)に直接アクセスするツールでは、通常DATABASE_URLの設定が必要です。 - Coolify/リバースプロキシのデプロイ:
DATABASE_URLには、パブリックドメインではなく、MCP サーバープロセスの実行場所から到達可能な内部ホスト名を指定する必要があります。- 起動時の
ECONNRESETエラーは、サーバーのネットワーク環境からDATABASE_URLに到達できないことを意味します。 - サーバーは引き続き正常に起動し、データベースへの直接接続を必要としないすべてのツールは通常どおり動作します。
セキュリティ
HTTP トランスポート(リモートアクセスに推奨)
--transport http を指定して実行すると、サーバーでは以下が適用されます。
- すべての
/mcpエンドポイントで、SUPABASE_AUTH_JWT_SECRETを使用した JWT 認証。 - 権限ベースのアクセス制御(RBAC) — JWT の
roleクレームによって、アクセス可能なツールが決まります。service_role:フルアクセス(特権ツールを含むすべてのツール)。authenticated:通常のツールのみ。anon:ツールへのアクセス不可。
- レート制限 — IP アドレスごとのリクエストレート制限を設定できます。
- CORS — 許可するオリジンのリストを設定できます(デフォルトでは localhost のみ)。
- セキュリティヘッダー —
X-Content-Type-Options、X-Frame-Options、Strict-Transport-Securityなど。 - リクエストタイムアウト — リソースの枯渇を防ぐタイムアウトを設定できます。
Stdio トランスポート(ローカル開発)
Stdio モードには 認証がありません — 特権ツールを含むすべてのツールにアクセスできます。このモードは、信頼できるローカルクライアント(例:ローカルマシンで実行する IDE 拡張機能)のみを対象としています。このモードを使用すると、起動時に警告が出力されます。
認証ユーザーツールのパスワード処理
create_auth_user と update_auth_user は、MCP クライアントから平文のパスワードを受け取り、auth.users に保存する前に bcrypt(PostgreSQL の pgcrypto 拡張機能を使用:crypt($password, gen_salt('bf')))で直ちにハッシュ化します。平文のパスワードは保存されません。パスワードはクエリパラメーターとして渡され(SQL 文字列に直接埋め込まれないため)、SQL インジェクションを防止します。
注: パスワードは、MCP クライアントとサーバー間でMCP トランスポートを通じて平文で送信されます。これは MCP プロトコルのインターフェースに固有のものであり、このレイヤーでは避けられません。ネットワークを保護するには、TLS 終端を設定した HTTP トランスポート(例:Kong/nginx の背後)を使用してください。
SQL 実行のセキュリティ
MCP サーバー内のすべてのデータベース操作では、SQL インジェクションを防ぐためにパラメーター化クエリ($1、$2、...)を使用します。execute_sql ツールは意図的な例外であり、設計上、任意の SQL を実行します(それがこのツールの目的です)。このツールは、露出を抑えるために service_role 権限レベルに制限されています。
使い方
Stdio モード(ローカル MCP クライアント)
必要な設定を指定して、Bun でサーバーを実行します。
# Using CLI arguments (stdio mode — default)
bun run dist/index.js --url http://localhost:8000 --anon-key <your-anon-key> \
--db-url postgresql://postgres:password@localhost:5432/postgres \
--service-key <your-service-key>
# Example with tool whitelisting via config file
bun run dist/index.js --url http://localhost:8000 --anon-key <your-anon-key> \
--tools-config ./mcp-tools.json
# Or configure using environment variables and run:
# export SUPABASE_URL=http://localhost:8000
# export SUPABASE_ANON_KEY=<your-anon-key>
# export DATABASE_URL=postgresql://postgres:password@localhost:5432/postgres
# export SUPABASE_SERVICE_ROLE_KEY=<your-service-key>
bun run dist/index.js
HTTP モード(Docker/リモートアクセス)
bun run dist/index.js \
--transport http \
--port 3100 \
--host 0.0.0.0 \
--url http://kong:8000 \
--anon-key <your-anon-key> \
--service-key <your-service-key> \
--jwt-secret <your-jwt-secret> \
--db-url postgresql://postgres:password@db:5432/postgres
HTTP モードでは --jwt-secret が必要です。すべての /mcp リクエストには、Authorization: Bearer <token> ヘッダーに有効な Supabase JWT を含める必要があります。
サーバーは stdio(デフォルト)または HTTP(Streamable HTTP Transport)を介して通信し、MCP クライアントアプリケーション(例:Cursor のような IDE 拡張機能)から呼び出されるように設計されています。クライアントはサーバーの stdio ストリームまたは HTTP エンドポイントに接続して、利用可能なツールの一覧表示や呼び出しを行います。
クライアント設定の例
以下は、このセルフホスト可能なサーバーを使用するための、一般的な MCP クライアントの設定例です。
重要:
<your-supabase-url>、<your-anon-key>、<your-db-url>、<path-to-dist/index.js>などのプレースホルダーを、実際の値に置き換えてください。- コンパイル済みサーバーファイル(
dist/index.js)へのパスが、ご利用のシステムで正しいことを確認してください。 - 特にバージョン管理にコミットする場合は、機密キーを設定ファイルに直接保存しないよう注意してください。クライアントが対応している場合は、環境変数やより安全な方法の使用を検討してください。
Cursor
-
プロジェクトのルートにあるファイル
.cursor/mcp.jsonを作成するか、開きます。 -
以下の設定を追加します。
{ "mcpServers": { "selfhosted-supabase": { "command": "bun", "args": [ "run", "<path-to-dist/index.js>", // e.g., "/home/user/selfhosted-supabase-mcp/dist/index.js" "--url", "<your-supabase-url>", // e.g., "http://localhost:8000" "--anon-key", "<your-anon-key>", // Optional - Add these if needed by the tools you use "--service-key", "<your-service-key>", "--db-url", "<your-db-url>", // e.g., "postgresql://postgres:password@host:port/postgres" "--jwt-secret", "<your-jwt-secret>", // Optional - Whitelist specific tools "--tools-config", "<path-to-your-mcp-tools.json>" // e.g., "./mcp-tools.json" ] } } }
Visual Studio Code (Copilot)
VS Code Copilot では、プロンプト入力で設定する環境変数を使用できます。キーをより安全に扱えます。
-
プロジェクトのルートにあるファイル
.vscode/mcp.jsonを作成するか、開きます。 -
以下の設定を追加します。
{ "inputs": [ { "type": "promptString", "id": "sh-supabase-url", "description": "Self-Hosted Supabase URL", "default": "http://localhost:8000" }, { "type": "promptString", "id": "sh-supabase-anon-key", "description": "Self-Hosted Supabase Anon Key", "password": true }, { "type": "promptString", "id": "sh-supabase-service-key", "description": "Self-Hosted Supabase Service Key (Optional)", "password": true, "required": false }, { "type": "promptString", "id": "sh-supabase-db-url", "description": "Self-Hosted Supabase DB URL (Optional)", "password": true, "required": false }, { "type": "promptString", "id": "sh-supabase-jwt-secret", "description": "Self-Hosted Supabase JWT Secret (Optional)", "password": true, "required": false }, { "type": "promptString", "id": "sh-supabase-server-path", "description": "Path to self-hosted-supabase-mcp/dist/index.js" }, { "type": "promptString", "id": "sh-supabase-tools-config", "description": "Path to tools config JSON (Optional, e.g., ./mcp-tools.json)", "required": false } ], "servers": { "selfhosted-supabase": { "command": "bun", "args": [ "run", "${input:sh-supabase-server-path}", "--tools-config", "${input:sh-supabase-tools-config}" ], "env": { "SUPABASE_URL": "${input:sh-supabase-url}", "SUPABASE_ANON_KEY": "${input:sh-supabase-anon-key}", "SUPABASE_SERVICE_ROLE_KEY": "${input:sh-supabase-service-key}", "DATABASE_URL": "${input:sh-supabase-db-url}", "SUPABASE_AUTH_JWT_SECRET": "${input:sh-supabase-jwt-secret}" } } } } -
Copilot Chat をエージェントモード(@workspace)で使用すると、サーバーが検出されます。サーバーを初めて呼び出すときに、詳細(URL、キー、パス)の入力を求められます。
Other Clients (Windsurf, Cline, Claude)
Cursor または Supabase の公式ドキュメントに示されている設定構造を参考にし、command と args を bun run コマンドおよびこのサーバー用の引数に置き換えてください。Cursor の例と同様です。
{
"mcpServers": {
"selfhosted-supabase": {
"command": "bun",
"args": [
"run",
"<path-to-dist/index.js>",
"--url", "<your-supabase-url>",
"--anon-key", "<your-anon-key>",
"--service-key", "<your-service-key>",
"--db-url", "<your-db-url>",
"--jwt-secret", "<your-jwt-secret>",
"--tools-config", "<path-to-your-mcp-tools.json>"
]
}
}
}
各クライアントのドキュメントを参照し、mcp.json または同等の設定ファイルを配置する場所を確認してください。
セルフホスト Supabase との Docker 統合
この MCP サーバーは、セルフホスト Supabase の Docker Compose スタックに直接統合でき、Kong API ゲートウェイを介して他の Supabase サービスと並行して利用できます。
アーキテクチャの概要
Docker と統合する場合:
- MCP サーバーは HTTP トランスポートモード(stdio ではありません)で実行されます
- Kong 経由で
/mcp/v1/*に公開されます - JWT 認証は MCP サーバー自体が処理します
- サーバーはデータベースとすべての Supabase キーに直接アクセスできます
セットアップ手順
1. MCP サーバーを Git サブモジュールとして追加する
Supabase の Docker ディレクトリから:
git submodule add https://github.com/HenkDz/selfhosted-supabase-mcp.git selfhosted-supabase-mcp
2. Dockerfile を作成する
volumes/mcp/Dockerfile を作成します:
# Dockerfile for selfhosted-supabase-mcp HTTP mode
# Multi-stage build using Bun runtime for self-hosted Supabase
FROM oven/bun:1.1-alpine AS builder
WORKDIR /app
# Copy package files from submodule
COPY selfhosted-supabase-mcp/package.json selfhosted-supabase-mcp/bun.lock* ./
# Install dependencies
RUN bun install --frozen-lockfile || bun install
# Copy source code
COPY selfhosted-supabase-mcp/src ./src
COPY selfhosted-supabase-mcp/tsconfig.json ./
# Build the application
RUN bun build src/index.ts --outdir dist --target bun
# Production stage
FROM oven/bun:1.1-alpine AS runner
WORKDIR /app
# Create non-root user for security
RUN addgroup --system --gid 1001 mcp && \
adduser --system --uid 1001 --ingroup mcp mcp
# Copy built application from builder
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./
# Set ownership
RUN chown -R mcp:mcp /app
USER mcp
# Default environment variables
ENV NODE_ENV=production
# Health check
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
CMD wget --no-verbose --tries=1 --spider http://localhost:3100/health || exit 1
# Expose HTTP port
EXPOSE 3100
# Start the MCP server in HTTP mode
CMD ["bun", "run", "dist/index.js"]
3. docker-compose.yml に MCP サービスを追加する
このサービス定義を docker-compose.yml に追加します:
## MCP Server - Model Context Protocol for AI integrations
## DISABLED BY DEFAULT - Add 'mcp' to COMPOSE_PROFILES to enable
mcp:
container_name: ${COMPOSE_PROJECT_NAME:-supabase}-mcp
profiles:
- mcp
build:
context: .
dockerfile: ./volumes/mcp/Dockerfile
restart: unless-stopped
healthcheck:
test:
[
"CMD",
"wget",
"--no-verbose",
"--tries=1",
"--spider",
"http://localhost:3100/health"
]
timeout: 5s
interval: 10s
retries: 3
depends_on:
db:
condition: service_healthy
rest:
condition: service_started
environment:
SUPABASE_URL: http://kong:8000
SUPABASE_ANON_KEY: ${ANON_KEY}
SUPABASE_SERVICE_ROLE_KEY: ${SERVICE_ROLE_KEY}
SUPABASE_AUTH_JWT_SECRET: ${JWT_SECRET}
DATABASE_URL: postgresql://postgres:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}
command:
[
"bun",
"run",
"dist/index.js",
"--transport", "http",
"--port", "3100",
"--host", "0.0.0.0",
"--url", "http://kong:8000",
"--anon-key", "${ANON_KEY}",
"--service-key", "${SERVICE_ROLE_KEY}",
"--jwt-secret", "${JWT_SECRET}",
"--db-url", "postgresql://postgres:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}"
]
4. Kong API Gateway のルートを追加する
volumes/api/kong.yml の services セクションに MCP のルートを追加します:
## MCP Server routes - Model Context Protocol for AI integrations
## Authentication is handled by the MCP server itself (JWT validation)
- name: mcp-v1
_comment: 'MCP Server: /mcp/v1/* -> http://mcp:3100/*'
url: http://mcp:3100/
routes:
- name: mcp-v1-all
strip_path: true
paths:
- /mcp/v1/
plugins:
- name: cors
config:
origins:
- "$SITE_URL_PATTERN"
- "http://localhost:3000"
- "http://127.0.0.1:3000"
methods:
- GET
- POST
- DELETE
- OPTIONS
headers:
- Accept
- Authorization
- Content-Type
- X-Client-Info
- apikey
- Mcp-Session-Id
exposed_headers:
- Mcp-Session-Id
credentials: true
max_age: 3600
5. MCP サービスを有効にする
MCP サービスでは Docker Compose のプロファイルを使用するため、デフォルトでは無効になっています。有効にするには:
方法 A:.env ファイルで設定する:
COMPOSE_PROFILES=mcp
方法 B:実行時に有効にする:
docker compose --profile mcp up -d
MCP サーバーへのアクセス
起動すると、MCP サーバーは次の場所で利用できます:
- 内部(他のコンテナから):
http://mcp:3100 - 外部(Kong 経由):
http://localhost:8000/mcp/v1/
認証
HTTP モードで実行する場合、MCP サーバーは設定された JWT_SECRET を使用して JWT を検証します。クライアントは Authorization ヘッダーに有効な Supabase JWT を含める必要があります:
Authorization: Bearer <supabase-jwt>
JWT の role クレームによってアクセス権が決まります:
service_role:すべてのツール(通常ツールと特権ツール)へのフルアクセスauthenticated:通常ツールのみ利用可能anon:ツールへのアクセス不可
ヘルスチェック
MCP サーバーはヘルスエンドポイントを公開します:
curl http://localhost:8000/mcp/v1/health
セキュリティに関する考慮事項
Docker 経由でデプロイする場合:
- MCP サーバーは非 root ユーザー(
mcp:mcp)として実行されます - すべてのツール呼び出しで JWT 認証が必須です
- 特権ツール(
execute_sqlなど)にはservice_roleJWT が必要です - CORS は Kong 経由で設定します。デプロイ環境に合わせてオリジンを調整してください
開発
- 言語: TypeScript
- ビルド:
bun build(bun run build経由) - ランタイム: Bun v1.1+
- テストランナー:
bun test - 依存関係:
bun(bun.lock)で管理 - コアライブラリ:
@supabase/supabase-js、pg(node-postgres)、zod(検証)、commander(CLI 引数)、@modelcontextprotocol/sdk(MCP サーバーのフレームワーク)、express、jsonwebtoken。
ライセンス
このプロジェクトは MIT ライセンスのもとでライセンスされています。詳細については LICENSE ファイルを参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。