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サーバーを選ぶ。
| DB | MCPサーバー | npm パッケージ |
|---|---|---|
| PostgreSQL | server-postgres(公式) | @modelcontextprotocol/server-postgres |
| MySQL | mcp-server-mysql | @benborla29/mcp-server-mysql |
| SQLite | server-sqlite(公式) | @modelcontextprotocol/server-sqlite |
| Supabase | Supabase 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検出・マイグレーション設計)はこちら:

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_REF と ACCESS_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に許すか」を決めておく必要がある。
接続先ごとの推奨設定
| 環境 | 推奨設定 | 理由 |
|---|---|---|
| 本番DB | READ ONLY(DB側ユーザー制限 or MCPフラグ) | データ破壊・漏洩リスク |
| ステージングDB | 読み書き可(DELETEは慎重に) | データ投入・テスト目的 |
| ローカル開発DB | 読み書き可 | 開発効率優先 |
| Supabase(本番) | 接続しない | 公式推奨 |
| Supabase(開発) | 読み書き可 | 開発プロジェクト限定 |
2層防御の設計
MCPレベルのフラグ(--readonly、ALLOW_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接続のシークレット管理についてはこちら:

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

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