Claude Code × データベースMCP完全ガイド — PostgreSQL / MySQL / SQLite / Supabase を横断接続する設計と実践

Claude Code × データベースMCP完全ガイド — PostgreSQL / MySQL / SQLite / Supabase を横断接続する設計と実践

Claude CodeへのデータベースMCP接続を主要DB別に整理。PostgreSQL・MySQL・SQLite・Supabaseのそれぞれで使えるMCPサーバーの選定基準、設定例、読み取り専用設計、複数DB同時接続パターンまで実装レベルで解説。

エンジニアのゆとです。

Claude Codeにデータベースを繋げると、何ができるかが一段変わる。

「このクエリが遅い原因を調べて」「このスキーマに対して〇〇するSQLを書いて」「テーブル設計の問題点を指摘して」——こういった依頼をDBに直接アクセスしながら処理できるようになる。

ただ、「どのMCPサーバーを選ぶか」の情報が整理されていない。PostgreSQL専用のMCPしか知らない人、「DBにMCPで繋げる」という事実だけ知っていて設定でつまずいている人、本番DBに読み書きをClaude Codeに許していて冷や汗をかいている人——いろんなパターンがある。

この記事では、主要なデータベース(PostgreSQL・MySQL・SQLite・Supabase)それぞれのMCP接続方法と、どのMCPサーバーを選ぶべきかを整理した。PostgreSQLの詳細な使い方は既存記事に任せて、今回は「複数DBを横断的に繋ぐ設計の地図」を作る。


データベースMCPの全体像:2種類のアプローチ

データベースをClaude CodeにMCP経由で繋ぐアプローチは、大きく2つに分かれる。

DB専用サーバー:対象DBに特化した機能

各DBのネイティブ機能を最大限活用したい場合はこちら。PostgreSQL固有のEXPLAIN ANALYZE、MySQLのストレージエンジン情報など、そのDBにしかない機能を使いたいならDB専用のMCPサーバーを選ぶ。

DBMCPサーバーnpm パッケージ
PostgreSQLserver-postgres(公式)@modelcontextprotocol/server-postgres
MySQLmcp-server-mysql@benborla29/mcp-server-mysql
SQLiteserver-sqlite(公式)@modelcontextprotocol/server-sqlite
SupabaseSupabase MCP(公式)HTTP接続(後述)

汎用マルチDBサーバー:複数DBをまとめて管理

複数のDBを横断したい、または接続先が変わっても設定を統一したい場合はこちら。DBHubが現時点で最も実用的な選択肢だ。

サーバー対応DBパッケージ
DBHub(Bytebase製)PostgreSQL, MySQL, MariaDB, SQL Server, SQLite@bytebase/dbhub

この記事では、DBHubをメイン軸に各DB専用サーバーの差分を補足する構成で進める。


DBHub:マルチDB接続の実用解

DBHubはBytebaseが開発したオープンソースのデータベースMCPサーバー。PostgreSQL・MySQL・MariaDB・SQL Server・SQLiteの5種類に対応している。

特徴は3つ。

  • ゼロ依存でトークン効率が高い:テーブル定義を丸ごとロードせず、必要な部分だけ検索するアーキテクチャになっている。100テーブル以上あるDBでも実用的に動く
  • 読み取り専用モードが1フラグ--readonly フラグ一発で書き込み操作を禁止できる
  • TOML設定で複数DB同時接続:本番・ステージング・開発DBを同一インスタンスで管理できる

インストールと基本設定

Node.js 22.5.0以上が必要。

# デモモードで動作確認(サンプルDBが自動起動する)
npx @bytebase/dbhub@latest --transport stdio --demo

Claude Codeへの追加:

# PostgreSQLに繋ぐ場合
claude mcp add --transport stdio db -- npx -y @bytebase/dbhub \
  --transport stdio \
  --dsn "postgres://user:pass@localhost:5432/mydb?sslmode=disable"

.mcp.json に書く場合:

{
  "mcpServers": {
    "db": {
      "command": "npx",
      "args": [
        "-y",
        "@bytebase/dbhub",
        "--transport",
        "stdio",
        "--dsn",
        "${DB_DSN}"
      ]
    }
  }
}

接続文字列は環境変数で管理するのが基本。.mcp.json をGitに入れる場合、認証情報をベタ書きすると漏れる。

# ~/.zshrc
export DB_DSN="postgres://myuser:mypassword@localhost:5432/mydb?sslmode=disable"

各DBのDSN形式

# PostgreSQL
postgres://user:pass@host:5432/dbname?sslmode=disable

# MySQL
mysql://user:pass@host:3306/dbname

# SQLite
sqlite:///./path/to/file.db

# SQL Server
sqlserver://user:pass@host:1433/dbname

# MariaDB(MySQLと同じ形式)
mysql://user:pass@host:3306/dbname

読み取り専用モード(本番DB接続時の必須設定)

claude mcp add --transport stdio db-prod -- npx -y @bytebase/dbhub \
  --transport stdio \
  --readonly \
  --dsn "${DB_PROD_DSN}"

--readonly を付けるとSELECT以外のSQLが実行時にブロックされる。本番DBを繋ぐ場合はこれを付けない理由がない。

TOML設定で複数DB接続

複数の環境や異なる種類のDBを同時に管理したい場合は、設定ファイルを使う。

# dbhub.toml

# 本番(PostgreSQL、読み取り専用)
[[sources]]
id = "production"
dsn = "${DB_PROD_DSN}"

[[tools]]
name = "execute_sql"
source = "production"
readonly = true

# ステージング(MySQL)
[[sources]]
id = "staging"
dsn = "${DB_STAGING_DSN}"

[[tools]]
name = "execute_sql"
source = "staging"
readonly = false

# ローカル開発(SQLite)
[[sources]]
id = "local"
dsn = "sqlite:///./dev.db"

[[tools]]
name = "execute_sql"
source = "local"
readonly = false

設定ファイルを使う起動:

npx @bytebase/dbhub@latest --transport stdio --config ./dbhub.toml

Claude Codeからは「productionのDBで〇〇して」「stagingのユーザーテーブルを見て」といった形で接続先を明示して使う。

SSHトンネル(踏み台サーバー経由)

直接接続できないリモートDBへの接続もサポートしている。

[[sources]]
id = "production"
dsn = "postgres://user:[email protected]:5432/mydb"
ssh_host = "bastion.example.com"
ssh_user = "ubuntu"
ssh_key = "~/.ssh/id_rsa"

PostgreSQL:専用MCPサーバーを選ぶ場合

DBHub経由でも十分使えるが、PostgreSQL固有の機能(EXPLAIN ANALYZE・pg_stat_statements・PostgreSQL固有の型)を使い込みたい場合は公式の専用サーバーを選ぶ。

# インストール不要、npx経由で実行
claude mcp add --transport stdio postgres -- npx -y \
  @modelcontextprotocol/server-postgres \
  "${POSTGRES_URL}"

.mcp.json 設定:

{
  "mcpServers": {
    "postgres": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-postgres",
        "${POSTGRES_URL}"
      ]
    }
  }
}

POSTGRES_URL の形式:

postgresql://[user]:[password]@[host]:[port]/[dbname]

注意点:公式の @modelcontextprotocol/server-postgres はデフォルトで読み書き両方が可能。本番DBに接続する場合は、DB側で読み取り専用ユーザーを作って接続する方法が現実的だ。

-- PostgreSQLで読み取り専用ユーザーを作る
CREATE ROLE claude_readonly;
GRANT CONNECT ON DATABASE mydb TO claude_readonly;
GRANT USAGE ON SCHEMA public TO claude_readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO claude_readonly;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO claude_readonly;

CREATE USER claude_agent PASSWORD 'secure-password';
GRANT claude_readonly TO claude_agent;

PostgreSQL MCPの詳しい使い方(EXPLAIN ANALYZE・N+1検出・マイグレーション設計)はこちら:

Claude Code × PostgreSQL MCP 導入完全ガイド——スキーマ理解からクエリ最適化まで自然言語でやる
Claude Code × PostgreSQL MCP 導入完全ガイド——スキーマ理解からクエリ最適化まで自然言語でやるClaude CodeのPostgreSQL MCP設定手順と実践的な使い方。自然言語でSQLを生成・実行・デバッグする方法、スキーマ設計の相談、インデックス最適化の依頼、N+1クエリの発見まで。接続設定とセキュリティ設計も丸ごと解説。読む →

MySQL:専用MCPサーバーの設定

MySQLには複数のコミュニティ製MCPサーバーがある。その中で @benborla29/mcp-server-mysql が最もメンテナンスされており、実績も多い。

特徴:

  • デフォルトで書き込み操作が無効(read-only)
  • INSERT・UPDATE・DELETEはenv変数で個別に有効化する設計
  • 複数データベースモード、SSH対応

設定例

claude mcp add mcp_server_mysql \
  -e MYSQL_HOST="127.0.0.1" \
  -e MYSQL_PORT="3306" \
  -e MYSQL_USER="root" \
  -e MYSQL_PASS="${MYSQL_PASSWORD}" \
  -e MYSQL_DB="your_database" \
  -- npx @benborla29/mcp-server-mysql

.mcp.json に書く場合:

{
  "mcpServers": {
    "mysql": {
      "command": "npx",
      "args": ["-y", "@benborla29/mcp-server-mysql"],
      "env": {
        "MYSQL_HOST": "127.0.0.1",
        "MYSQL_PORT": "3306",
        "MYSQL_USER": "root",
        "MYSQL_PASS": "${MYSQL_PASSWORD}",
        "MYSQL_DB": "your_database"
      }
    }
  }
}

書き込み操作の個別制御

デフォルトはすべてREAD ONLY。以下の環境変数で個別に有効化する。

{
  "env": {
    "MYSQL_HOST": "127.0.0.1",
    "MYSQL_USER": "root",
    "MYSQL_PASS": "${MYSQL_PASSWORD}",
    "MYSQL_DB": "your_database",
    "ALLOW_INSERT_OPERATION": "true",
    "ALLOW_UPDATE_OPERATION": "true",
    "ALLOW_DELETE_OPERATION": "false"
  }
}

INSERTとUPDATEは許可するがDELETEは禁止、という粒度での制御ができる。開発環境でのデータ投入はOKだが削除は手動で確認、という運用に向いている。


SQLite:組み込みDB・ローカルDBへの接続

SQLiteはファイルベースなので、設定が最もシンプル。ローカルの開発用DBや、軽量ツールが生成するDBを読ませたいケースに使う。

公式の @modelcontextprotocol/server-sqlite を使う場合:

claude mcp add --transport stdio sqlite -- npx -y \
  @modelcontextprotocol/server-sqlite \
  /path/to/your/database.db

.mcp.json 設定:

{
  "mcpServers": {
    "sqlite": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-sqlite",
        "${SQLITE_DB_PATH}"
      ]
    }
  }
}

SQLITE_DB_PATH に絶対パスを指定する。

DBHub経由のSQLite接続(マルチDB環境との統一):

{
  "mcpServers": {
    "db": {
      "command": "npx",
      "args": [
        "-y",
        "@bytebase/dbhub",
        "--transport",
        "stdio",
        "--dsn",
        "sqlite:///Users/yourname/project/dev.db"
      ]
    }
  }
}

複数のDBを既にDBHubで管理している場合は、SQLiteもDBHub経由に統一する方が設定がシンプルになる。


Supabase:ホスティングDB向けの公式MCPサーバー

SupabaseはPostgreSQLをベースにしたBaaS(Backend as a Service)で、公式のMCPサーバーが提供されている。

他のDBのMCPとは構造が違う。接続文字列ではなく、Supabase固有の PROJECT_REFACCESS_TOKEN で認証するHTTPベースのMCPサーバーだ。

Supabase MCPの接続設定

{
  "mcpServers": {
    "supabase": {
      "type": "http",
      "url": "https://mcp.supabase.com/mcp?project_ref=${SUPABASE_PROJECT_REF}",
      "headers": {
        "Authorization": "Bearer ${SUPABASE_ACCESS_TOKEN}"
      }
    }
  }
}

環境変数の設定:

# Supabaseのダッシュボード > Project Settings > General で確認できる
export SUPABASE_PROJECT_REF="your-project-ref"

# Supabase Personal Access Token(アカウント設定で発行)
export SUPABASE_ACCESS_TOKEN="sbp_xxxxxxxxxx"

または claude mcp add コマンドで:

claude mcp add --transport http supabase \
  "https://mcp.supabase.com/mcp?project_ref=${SUPABASE_PROJECT_REF}" \
  --header "Authorization: Bearer ${SUPABASE_ACCESS_TOKEN}"

Supabase MCPが提供する機能

SupabaseのMCPはPostgreSQL MCPとは異なり、DBクエリだけでなくSupabaseプラットフォーム全体へのアクセスを提供する。

  • データベースのクエリ・スキーマ確認
  • Edge Functionsの管理
  • Supabaseのドキュメント検索
  • Storage・Auth周りの操作

これはDBそのものへのMCP接続とは用途が異なる。「Supabase上で動くアプリを開発する」文脈では便利だが、「純粋にPostgreSQLとして使いたい」場合は @modelcontextprotocol/server-postgres に直接繋いだ方がシンプルだ。

本番データへのアクセスは避ける

Supabase公式ドキュメントに明記されている通り、本番環境への接続は推奨されていない。

開発・テスト目的に限定して使う。本番データへのLLMアクセスはプロンプトインジェクション攻撃のリスクがある(悪意のある文字列がDBに入っていた場合、それを読み込んだClaudeが意図しない操作をする可能性がある)。


読み取り専用 vs 書き込み可:セキュリティ設計の考え方

DBに繋ぐ前に、「どこまでClaude Codeに許すか」を決めておく必要がある。

接続先ごとの推奨設定

環境推奨設定理由
本番DBREAD ONLY(DB側ユーザー制限 or MCPフラグ)データ破壊・漏洩リスク
ステージングDB読み書き可(DELETEは慎重に)データ投入・テスト目的
ローカル開発DB読み書き可開発効率優先
Supabase(本番)接続しない公式推奨
Supabase(開発)読み書き可開発プロジェクト限定

2層防御の設計

MCPレベルのフラグ(--readonlyALLOW_DELETE_OPERATION=false)とDB側のユーザー権限制御を組み合わせるのが望ましい。MCPレベルの制御だけだと、設定ミスで権限が広がることがある。

-- PostgreSQLでの読み取り専用ユーザー
CREATE USER claude_agent WITH PASSWORD '${AGENT_PASSWORD}';
GRANT CONNECT ON DATABASE mydb TO claude_agent;
GRANT USAGE ON SCHEMA public TO claude_agent;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO claude_agent;
-- ALTER後に作られるテーブルにも自動でSELECT権限を付与
ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT ON TABLES TO claude_agent;

DBHub では --readonly フラグを追加する:

# 本番DB接続(読み取り専用)
claude mcp add --transport stdio db-prod -- npx -y @bytebase/dbhub \
  --transport stdio \
  --readonly \
  --dsn "${PROD_DSN}"

CLAUDE.mdにDB操作ルールを書く

プロジェクトレベルで操作ルールを制約しておくと、Claudeが自主的に範囲を守るようになる。

## データベース操作ルール

### 接続先の使い分け
- db-local: 開発用(読み書き可)
- db-prod: 本番用(SELECT のみ。確認目的限定)

### 禁止事項
- 本番DBへのDML(INSERT/UPDATE/DELETE)は絶対禁止
- SELECT * の使用禁止(必要なカラムを明示する)
- LIMITなしのSELECTは禁止
- マイグレーションの自動実行禁止(必ず確認を求める)

Claude Codeからの実際の使い方

MCPでDBが繋がった後、Claude Codeからどう使うか。

スキーマの把握

claude > db-localのテーブル一覧を確認して
claude > usersテーブルのスキーマをMermaid ER図で出力して

クエリの生成と実行

claude > 過去30日間に5回以上注文したユーザーの一覧を取るSQLを書いて実行して

DBに繋がっている場合、Claudeはスキーマを確認してからSQLを書く。カラム名のタイポや型の不一致でSQL生成が失敗するケースが激減する。

スロークエリの診断(PostgreSQL)

claude > このクエリが遅い。EXPLAIN ANALYZEを実行して原因を分析して

SELECT * FROM orders
WHERE status = 'pending'
AND created_at > '2026-01-01'
ORDER BY created_at DESC;

PostgreSQL専用MCPを使っている場合、実際にEXPLAIN ANALYZEを実行してQueryPlanを解析し、インデックスの提案まで返してくれる。

複数DB横断での比較

DBHubのTOML設定で複数DBを接続していれば:

claude > stagingのusersテーブルとproductionのusersテーブルのスキーマを比較して差分を報告して

接続先を名前で指定するだけで横断アクセスができる。環境間でスキーマが乖離していないかの確認に使える。


MCPサーバー選定のまとめ

状況別の選択基準:

PostgreSQLだけを使っていてDB固有機能を最大活用したい@modelcontextprotocol/server-postgres + 本番はread-onlyユーザーで接続

MySQLを使っている@benborla29/mcp-server-mysql(書き込み制御が env 変数レベルで細かくできる)

複数のDBを使っていて設定を統一したい@bytebase/dbhub(TOML設定で本番・ステージング・開発を一括管理)

SQLiteだけで完結する軽量プロジェクト@modelcontextprotocol/server-sqlite(シンプルなセットアップ)

Supabaseで開発している → Supabase公式MCPのHTTP接続(ただし本番環境は接続しない)

どれを選んでも読み取り専用設計は最低限やっておく。MCPでDBを繋ぐことのリスクは「Claude Codeが賢くなる」ことにあるのではなく、「それが意図しない操作をする可能性がある」ことにある。


よくある質問


まとめ

データベースMCPの選択は、「どのDBを使っているか」と「単一DBか複数DBか」で決まる。

PostgreSQL専用で使い込むなら公式の @modelcontextprotocol/server-postgres、複数環境を横断するなら @bytebase/dbhub、MySQLならデフォルト読み取り専用の @benborla29/mcp-server-mysql、Supabaseなら公式のHTTP接続。

どれを選んでも共通して言えるのは、本番DBは読み取り専用で繋ぐこと。MCPが便利なのはセキュリティ設計を怠っていい理由にはならない。

DB接続のシークレット管理についてはこちら:

Claude Code × MCP で APIキー・シークレットを統合管理する — 1Password / GitHub Secrets / Vault の3パターン実装
Claude Code × MCP で APIキー・シークレットを統合管理する — 1Password / GitHub Secrets / Vault の3パターン実装Claude Code環境でシークレットをMCPで統合管理する3パターンを実装レベルで解説。1Password op://URI連携、GitHub Codespaces・Actions連携、HashiCorp Vault dynamic secrets。mcp.json設定例とセキュリティリスク評価付き。読む →

MCPサーバー全般の設定方法はこちら:

Claude Code MCP設定ガイド — サーバーの追加から実用5選まで【2026年版】
Claude Code MCP設定ガイド — サーバーの追加から実用5選まで【2026年版】Claude Code MCPの設定方法をゼロから解説。MCPサーバーの追加・削除・スコープ管理、Filesystem・GitHub・Brave Search・Puppeteer・自作サーバーの実用5選、よくあるエラーと対処法まで網羅。読む →

どのMCPサーバーを日常的に使うべきか迷っている場合はこちら:

Claude Code MCPおすすめ10選 2026——フリーランスエンジニアが本当に使っているサーバーと設定
Claude Code MCPおすすめ10選 2026——フリーランスエンジニアが本当に使っているサーバーと設定Claude CodeのMCPを何を入れるべきか迷っている人向け。実際に使い続けている10本を選定基準・設定コード付きで解説。Serena MCPやFigma+Playwright連携など競合記事が書かないギャップも網羅。読む →
← 記事一覧に戻る