mcpField
S
Self-Hosted Supabase MCP Server

Self-Hosted Supabase MCP Server

ローカル
github.com/HenkDzクラウド・インフラ13836 週間前に更新

Self-Hosted Supabase MCP Server について

Self-Hosted Supabase MCP Server は、セルフホスト可能な Supabase インスタンス向けの MCP サーバーです。開発環境からスキーマ、マイグレーション、認証ユーザーを確認できます。クラウド版のマルチプロジェクト機能を省き、単一プロジェクトに絞った実装です。

主な機能

  1. 01スキーマ、拡張機能、インデックスの参照
  2. 02マイグレーションの一覧表示と適用
  3. 03認証ユーザーの作成、取得、更新、削除
  4. 04Storage のバケットとオブジェクトの管理
  5. 05HTTP モードでのロールに基づくツール制御
  6. 06HTTP と stdio の transport 対応

活用シーン

  1. 01IDE からテーブル、インデックス、外部キーを確認する
  2. 02接続状況、統計情報、RLS ポリシーを調べる
  3. 03セルフホスト環境のスキーマから TypeScript 型を生成する

MCP 対応

本プロジェクトは MCP サーバーとして、データベース、認証、ストレージに関するツールを MCP クライアントに提供します。HTTP モードでは JWT の role クレームによって利用可能なツールが決まります。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"selfhosted-supabase": {
"command": "npx",
"args": [
"-y",
"@smithery/cli"
]
}
}
}
起動コマンドnpx -y @smithery/cli

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npm@smithery/cli

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

セルフホスト Supabase MCP サーバー

License: MIT smithery badge

概要

このプロジェクトは、セルフホスト Supabase インスタンスとの連携に特化した Model Context Protocol(MCP) サーバーを提供します。MCP クライアント(IDE 拡張機能など)と、ローカルまたはプライベートにホストされた Supabase プロジェクトとの間をつなぎ、開発環境から直接、データベースの調査、管理、操作を可能にします。

このサーバーは、公式 Supabase クラウド MCP サーバーを適応する過程で得た知見を活かし、セルフホスト用途に合わせた、最小限で用途を絞った実装として一から構築されました。

目的

このサーバーの主な目的は、セルフホスト Supabase を使用する開発者が、次のようなタスクに MCP ベースのツールを活用できるようにすることです。

  • データベースのスキーマとデータを照会する。
  • データベースのマイグレーションを管理する。
  • データベースの統計情報と接続を調査する。
  • 認証ユーザーを管理する。
  • Supabase Storage を操作する。
  • 型定義を生成する。

マルチプロジェクト管理やクラウド固有の API に関する公式クラウドサーバーの複雑さを避け、単一プロジェクトのセルフホスト環境に適した、シンプルな利用体験を提供します。

機能(実装済みのツール)

ツールは権限レベルごとに分類されています。

  • 一般ツールは、認証済みの Supabase JWT(authenticated または service_role ロール)を持つすべてのユーザーが利用できます。
  • 特権ツールには、service_role JWT(HTTP モード)、またはデータベース/サービスキーへの直接アクセス(stdio モード)が必要です。
スキーマとマイグレーション
ツール説明権限
list_tablesデータベーススキーマ内のテーブルを一覧表示します一般
list_extensionsインストール済みの PostgreSQL 拡張機能を一覧表示します一般
list_available_extensions利用可能(インストール可能)な拡張機能をすべて一覧表示します一般
list_migrationssupabase_migrations.schema_migrations に記録された適用済みマイグレーションを一覧表示します一般
apply_migrationSQL マイグレーションを適用し、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_statspgvector インデックスの統計情報を表示します一般
セキュリティと RLS
ツール説明権限
list_rls_policiesテーブルの行レベルセキュリティポリシーを一覧表示します一般
get_rls_statusテーブルの RLS が有効か無効かを表示します一般
get_advisorsセキュリティとパフォーマンスに関するアドバイザリ通知を取得します一般
プロジェクト設定
ツール説明権限
get_project_url設定されている Supabase URL を返します通常
verify_jwt_secretJWT シークレットが設定されているか確認します通常
開発・拡張ツール
ツール説明権限
generate_typescript_typesデータベーススキーマから TypeScript 型を生成します通常
rebuild_hookspg_net ワーカーを再起動します(使用している場合)特権
get_logs最近のログエントリーを取得します(分析スタックまたは CSV フォールバック)通常
認証ユーザー管理
ツール説明権限
list_auth_usersauth.users のユーザー一覧を表示します通常
get_auth_user特定のユーザーの詳細を取得します通常
create_auth_userauth.users に新しいユーザーを作成します(パスワードは pgcrypto で bcrypt ハッシュ化)特権
update_auth_userユーザーの詳細を更新します(パスワードを変更した場合は bcrypt ハッシュ化)特権
delete_auth_userauth.users からユーザーを削除します特権
ストレージ
ツール説明権限
list_storage_bucketsすべてのストレージバケットを一覧表示します通常
list_storage_objects特定のバケット内のオブジェクトを一覧表示します通常
get_storage_configストレージバケットの設定を取得します通常
update_storage_configストレージバケットの設定を更新します特権
Realtime の検査
ツール説明権限
list_realtime_publicationsPostgreSQL のパブリケーション(例:supabase_realtime)を一覧表示します通常
拡張機能固有のツール
ツール説明権限
list_cron_jobsスケジュール済みジョブを一覧表示します(pg_cron 拡張機能が必要)通常
get_cron_job_historycron ジョブの最近の実行履歴を表示します通常
list_vector_indexespgvector インデックスを一覧表示します(pgvector 拡張機能が必要)通常
Edge Functions
ツール説明権限
list_edge_functionsデプロイ済みの Edge Functions を一覧表示します通常
get_edge_function_detailsEdge Function の詳細とメタデータを取得します通常
list_edge_function_logsEdge 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 接続文字列)。
手順
  1. リポジトリをクローンします:
    git clone <repository-url>
    cd selfhosted-supabase-mcp
    
  2. 依存関係をインストールします:
    bun install
    
  3. プロジェクトをビルドします:
    bun run build
    
    これにより、TypeScript ソースがコンパイルされ、dist ディレクトリに 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
  1. プロジェクトのルートにあるファイル .cursor/mcp.json を作成するか、開きます。

  2. 以下の設定を追加します。

    {
      "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 では、プロンプト入力で設定する環境変数を使用できます。キーをより安全に扱えます。

  1. プロジェクトのルートにあるファイル .vscode/mcp.json を作成するか、開きます。

  2. 以下の設定を追加します。

    {
      "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}"
          }
        }
      }
    }
    
  3. 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 経由でデプロイする場合:

  1. MCP サーバーは非 root ユーザー(mcp:mcp)として実行されます
  2. すべてのツール呼び出しで JWT 認証が必須です
  3. 特権ツール(execute_sql など)には service_role JWT が必要です
  4. 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 ファイルを参照してください。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。