はじめに#
Claude Codeは、MCPサーバーを通じて外部システムと連携することで、その機能を大幅に拡張できます。中でもデータベースとの連携は、開発者の日常業務を効率化する強力な機能です。DBHub MCPサーバーを使えば、自然言語でSQLクエリを生成・実行し、スキーマを分析し、マイグレーションの作成を支援してもらうことが可能になります。
本記事では、DBHub MCPサーバーのセットアップから実践的な活用方法までを詳しく解説します。この記事を読むことで、以下のことができるようになります。
- DBHub MCPサーバーをClaude Codeに設定する
- 自然言語でデータベースをクエリする
- スキーマ分析と設計提案をClaude Codeに依頼する
- マイグレーションファイルの作成を効率化する
実行環境#
- オペレーティングシステム: macOS 10.15以上、Ubuntu 20.04以上/Debian 10以上、Windows 10以上(WSL 1/2またはGit for Windows)
- ハードウェア: 4GB以上のRAM
- Node.js 18以上(npmインストールの場合のみ必要)
- インターネット接続(認証およびAI処理に必要)
- シェル環境: Bash、Zsh、またはFish推奨
前提条件#
- コマンドライン操作の基礎知識
- Gitの基本操作(clone、commit、push等)
- プログラミングの基礎知識(言語は問わない)
- Claude.aiまたはAnthropic Consoleアカウント
- Claude Codeのインストールと認証が完了していること
- MCPの基本概念を理解していること(Claude CodeとMCP連携入門を参照)
DBHub MCPサーバーとは#
DBHubは、Bytebase社が開発したゼロ依存・トークン効率に優れたデータベース用MCPサーバーです。Claude Code、Claude Desktop、Cursor、VS Codeなど、MCP対応クライアントからデータベースに接続し、自然言語で操作できるようになります。
graph LR
A[Claude Code] --> B[DBHub<br>MCPサーバー]
B --> C[PostgreSQL]
B --> D[MySQL]
B --> E[SQLite]
B --> F[SQL Server]
B --> G[MariaDB]DBHubの特徴#
DBHubには以下の特徴があります。
| 特徴 |
説明 |
| ゼロ依存 |
外部パッケージに依存せず軽量 |
| トークン効率 |
2つのMCPツールに集約し、コンテキストウィンドウを最大化 |
| マルチデータベース対応 |
PostgreSQL、MySQL、MariaDB、SQL Server、SQLite |
| マルチ接続 |
TOML設定で複数データベースに同時接続 |
| ガードレール |
読み取り専用モード、行数制限、クエリタイムアウト |
| セキュア接続 |
SSHトンネル、SSL/TLS暗号化対応 |
提供されるMCPツール#
DBHubは以下のMCPツールを提供します。
execute_sql
SQLクエリを実行するツールです。SELECT、INSERT、UPDATE、DELETEなどの操作、トランザクション制御、DDL操作が可能です。読み取り専用モードや行数制限などの安全機能も備えています。
search_objects
データベースオブジェクト(スキーマ、テーブル、カラム、インデックス、プロシージャ)を検索・一覧表示するツールです。パターンマッチングと段階的な詳細表示により、トークン使用量を最小化しながらスキーマを探索できます。
DBHub MCPサーバーのセットアップ#
基本的なインストールと接続#
Claude CodeにDBHubを追加する最もシンプルな方法は、claude mcp addコマンドを使用することです。
PostgreSQLへの接続
1
2
3
|
claude mcp add --transport stdio dbhub -- npx @bytebase/dbhub@latest \
--transport stdio \
--dsn "postgres://user:password@localhost:5432/dbname"
|
MySQLへの接続
1
2
3
|
claude mcp add --transport stdio dbhub -- npx @bytebase/dbhub@latest \
--transport stdio \
--dsn "mysql://user:password@localhost:3306/dbname"
|
SQLiteへの接続
1
2
3
|
claude mcp add --transport stdio dbhub -- npx @bytebase/dbhub@latest \
--transport stdio \
--dsn "sqlite:///./data/local.db"
|
Dockerを使用したインストール#
Dockerを使用する場合は、HTTPトランスポートでDBHubを起動します。
1
2
3
4
5
6
7
|
docker run --rm --init \
--name dbhub \
--publish 8080:8080 \
bytebase/dbhub \
--transport http \
--port 8080 \
--dsn "postgres://user:password@host.docker.internal:5432/dbname"
|
Docker内からホストマシンのデータベースに接続する場合は、localhostではなくhost.docker.internalを使用してください。
その後、Claude CodeにHTTPトランスポートで追加します。
1
|
claude mcp add --transport http dbhub http://localhost:8080/mcp
|
Windowsでの設定#
Windows環境(WSL以外)では、cmd /cラッパーが必要です。
1
2
3
|
claude mcp add --transport stdio dbhub -- cmd /c npx @bytebase/dbhub@latest ^
--transport stdio ^
--dsn "postgres://user:password@localhost:5432/dbname"
|
デモモードでの動作確認#
DBHubの機能を試すには、組み込みのデモモードを使用します。
1
2
3
|
claude mcp add --transport stdio dbhub-demo -- npx @bytebase/dbhub@latest \
--transport stdio \
--demo
|
デモモードでは、サンプルの従業員データベース(SQLite)が自動的に作成され、すぐにDBHubの機能を体験できます。
接続確認#
DBHubが正しく設定されているか確認するには、Claude Code内で/mcpコマンドを実行します。
1
2
3
4
5
|
> /mcp
利用可能なMCPサーバー:
dbhub (stdio) - 接続済み
ツール: execute_sql, search_objects
|
自然言語によるSQLクエリ生成#
DBHub MCPサーバーを設定すると、Claude Codeに自然言語でデータベース操作を依頼できるようになります。
基本的なクエリの実行#
Claude Codeは以下のような流れで処理します。
search_objectsでテーブル構造を確認
- 適切なSQLクエリを生成
execute_sqlでクエリを実行
- 結果を整形して表示
生成されるSQLの例は以下の通りです。
1
2
3
4
|
SELECT id, name, email, created_at
FROM users
WHERE created_at >= DATE_TRUNC('month', CURRENT_DATE)
ORDER BY created_at DESC;
|
集計クエリの生成#
1
|
> カテゴリ別の商品売上を集計して、売上の多い順に表示して
|
Claude Codeは複雑な集計クエリも自動生成します。
1
2
3
4
5
6
7
8
9
10
11
12
|
SELECT
c.name AS category_name,
COUNT(o.id) AS order_count,
SUM(oi.quantity * oi.price) AS total_revenue,
AVG(oi.quantity * oi.price) AS avg_order_value
FROM categories c
JOIN products p ON c.id = p.category_id
JOIN order_items oi ON p.id = oi.product_id
JOIN orders o ON oi.order_id = o.id
WHERE o.status = 'completed'
GROUP BY c.id, c.name
ORDER BY total_revenue DESC;
|
条件付きクエリの実行#
1
|
> 過去90日間購入がない顧客で、以前は月1回以上購入していた人を見つけて
|
Claude Codeはビジネスロジックを理解し、適切なSQLを生成します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
WITH customer_purchase_history AS (
SELECT
c.id,
c.email,
MAX(o.created_at) AS last_purchase,
COUNT(o.id) AS total_orders,
COUNT(o.id) / GREATEST(
EXTRACT(MONTH FROM AGE(MAX(o.created_at), MIN(o.created_at))),
1
) AS monthly_avg
FROM customers c
JOIN orders o ON c.id = o.customer_id
WHERE o.status = 'completed'
GROUP BY c.id, c.email
)
SELECT id, email, last_purchase, total_orders, monthly_avg
FROM customer_purchase_history
WHERE last_purchase < CURRENT_DATE - INTERVAL '90 days'
AND monthly_avg >= 1
ORDER BY last_purchase;
|
スキーマ分析と設計提案#
DBHubのsearch_objectsツールを使うと、Claude Codeにデータベーススキーマを詳細に分析させることができます。
スキーマの全体像を把握する#
Claude Codeはsearch_objectsを使用して段階的にスキーマを探索します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
[search_objects実行]
object_type: "schema"
detail_level: "summary"
[search_objects実行]
object_type: "table"
detail_level: "names"
データベース構成:
- public スキーマ
- users (ユーザー管理)
- products (商品マスタ)
- orders (注文)
- order_items (注文明細)
- categories (商品カテゴリ)
- reviews (商品レビュー)
|
テーブル設計のレビュー#
1
|
> ordersテーブルの設計をレビューして、改善点があれば提案して
|
Claude Codeはスキーマを分析し、設計上の問題点を指摘します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
ordersテーブルの分析結果:
現在の構造:
- id: SERIAL PRIMARY KEY
- customer_id: INTEGER (FK)
- status: VARCHAR(50)
- total_amount: DECIMAL(10,2)
- created_at: TIMESTAMP
- updated_at: TIMESTAMP
改善提案:
1. ステータスカラムの正規化
現在VARCHAR(50)ですが、ENUM型またはステータスマスタテーブルへの
外部キー参照を推奨します。これにより不正な値の登録を防止できます。
2. インデックスの追加
customer_idにインデックスがありません。顧客別の注文検索が
頻繁に行われる場合、パフォーマンス低下の原因になります。
CREATE INDEX idx_orders_customer_id ON orders(customer_id);
3. 論理削除の検討
deleted_atカラムの追加を検討してください。注文履歴は
コンプライアンス上、物理削除より論理削除が適切な場合があります。
|
正規化の分析#
1
|
> このデータベースの正規化状態を分析して、非正規化されている部分があれば指摘して
|
Claude Codeは複数のテーブル間の関係を分析し、正規化の問題を特定します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
正規化分析結果:
問題1: productsテーブルのcategory_name冗長性
- category_idとcategory_nameの両方が存在
- category_nameはcategoriesテーブルから取得すべき
- 更新時の不整合リスクあり
推奨アクション:
ALTER TABLE products DROP COLUMN category_name;
問題2: order_itemsテーブルの非正規化
- product_nameとunit_priceを保持(意図的な履歴保持の可能性)
- 商品マスタ変更の影響を受けないメリットがある
- ビジネス要件次第では許容範囲
|
マイグレーション作成支援#
Claude Codeは、データベースの変更に必要なマイグレーションファイルの作成も支援します。
新規テーブルのマイグレーション#
1
|
> 商品在庫を管理するinventoryテーブルのマイグレーションを作成して
|
Claude Codeは、既存のスキーマを分析した上で、整合性のあるマイグレーションを生成します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
-- Migration: create_inventory_table
-- Created at: 2026-01-08
-- Up Migration
CREATE TABLE inventory (
id SERIAL PRIMARY KEY,
product_id INTEGER NOT NULL REFERENCES products(id) ON DELETE CASCADE,
warehouse_id INTEGER NOT NULL,
quantity INTEGER NOT NULL DEFAULT 0,
reserved_quantity INTEGER NOT NULL DEFAULT 0,
reorder_point INTEGER NOT NULL DEFAULT 10,
last_restocked_at TIMESTAMP,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT positive_quantity CHECK (quantity >= 0),
CONSTRAINT positive_reserved CHECK (reserved_quantity >= 0),
CONSTRAINT reserved_not_exceed_quantity CHECK (reserved_quantity <= quantity)
);
CREATE INDEX idx_inventory_product_id ON inventory(product_id);
CREATE INDEX idx_inventory_warehouse_id ON inventory(warehouse_id);
CREATE UNIQUE INDEX idx_inventory_product_warehouse
ON inventory(product_id, warehouse_id);
-- Down Migration
DROP TABLE IF EXISTS inventory;
|
カラム追加のマイグレーション#
1
|
> usersテーブルに2要素認証用のカラムを追加するマイグレーションを作成して
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
-- Migration: add_2fa_columns_to_users
-- Created at: 2026-01-08
-- Up Migration
ALTER TABLE users
ADD COLUMN two_factor_enabled BOOLEAN NOT NULL DEFAULT FALSE,
ADD COLUMN two_factor_secret VARCHAR(255),
ADD COLUMN two_factor_backup_codes TEXT[],
ADD COLUMN two_factor_confirmed_at TIMESTAMP;
-- Down Migration
ALTER TABLE users
DROP COLUMN IF EXISTS two_factor_confirmed_at,
DROP COLUMN IF EXISTS two_factor_backup_codes,
DROP COLUMN IF EXISTS two_factor_secret,
DROP COLUMN IF EXISTS two_factor_enabled;
|
インデックス最適化のマイグレーション#
1
|
> 現在のクエリパフォーマンスを分析して、必要なインデックスのマイグレーションを提案して
|
Claude Codeはテーブル構造と想定されるクエリパターンを分析します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
-- Migration: add_performance_indexes
-- Created at: 2026-01-08
-- Based on query pattern analysis
-- Up Migration
-- ordersテーブル: 日付範囲とステータスでの検索最適化
CREATE INDEX idx_orders_created_status
ON orders(created_at DESC, status);
-- order_itemsテーブル: 商品別売上集計の最適化
CREATE INDEX idx_order_items_product_order
ON order_items(product_id, order_id);
-- reviewsテーブル: 商品別レビュー取得の最適化
CREATE INDEX idx_reviews_product_created
ON reviews(product_id, created_at DESC);
-- Down Migration
DROP INDEX IF EXISTS idx_reviews_product_created;
DROP INDEX IF EXISTS idx_order_items_product_order;
DROP INDEX IF EXISTS idx_orders_created_status;
|
複数データベースの同時接続#
本番環境、ステージング環境、開発環境など、複数のデータベースを同時に管理する場合は、TOML設定ファイルを使用します。
TOML設定ファイルの作成#
プロジェクトルートにdbhub.tomlファイルを作成します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
# 本番データベース(読み取り専用)
[[sources]]
id = "production"
dsn = "postgres://readonly:password@prod.db.example.com:5432/myapp"
connection_timeout = 60
query_timeout = 30
sslmode = "require"
[[tools]]
name = "execute_sql"
source = "production"
readonly = true
max_rows = 1000
[[tools]]
name = "search_objects"
source = "production"
# ステージングデータベース
[[sources]]
id = "staging"
dsn = "postgres://admin:password@staging.db.example.com:5432/myapp"
connection_timeout = 30
query_timeout = 15
[[tools]]
name = "execute_sql"
source = "staging"
readonly = false
max_rows = 5000
[[tools]]
name = "search_objects"
source = "staging"
# ローカル開発データベース
[[sources]]
id = "local"
dsn = "postgres://postgres:postgres@localhost:5432/myapp_dev"
[[tools]]
name = "execute_sql"
source = "local"
readonly = false
[[tools]]
name = "search_objects"
source = "local"
|
TOML設定でDBHubを起動#
1
2
3
4
|
# TOML設定を使用してDBHubを追加
claude mcp add --transport stdio dbhub -- npx @bytebase/dbhub@latest \
--transport stdio \
--config ./dbhub.toml
|
環境を指定したクエリ実行#
複数データベースが設定されている場合、Claude Codeに環境を指定して操作を依頼できます。
1
|
> 本番環境のordersテーブルから今日の注文数を取得して
|
Claude Codeはproductionソースを使用してクエリを実行します。
1
|
> ステージング環境で、新しいユーザー登録処理をテストして
|
Claude Codeはstagingソースを使用し、書き込み操作も実行できます。
カスタムツールの定義#
よく使うクエリをカスタムツールとして定義すると、パラメータ検証付きで安全に再利用できます。
カスタムツールの設定例#
dbhub.tomlにカスタムツールを追加します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
[[sources]]
id = "production"
dsn = "postgres://readonly:password@prod.db.example.com:5432/myapp"
# ユーザー検索カスタムツール
[[tools]]
name = "search_users_by_email"
description = "メールアドレスのパターンでユーザーを検索する"
source = "production"
statement = """
SELECT id, name, email, created_at, last_login_at
FROM users
WHERE email ILIKE '%' || $1 || '%'
ORDER BY created_at DESC
LIMIT $2
"""
[[tools.parameters]]
name = "email_pattern"
type = "string"
description = "検索するメールアドレスのパターン"
[[tools.parameters]]
name = "limit"
type = "integer"
description = "取得する最大件数"
default = 10
# 売上レポートカスタムツール
[[tools]]
name = "get_sales_report"
description = "指定期間の売上レポートを取得する"
source = "production"
statement = """
SELECT
DATE(o.created_at) AS order_date,
COUNT(DISTINCT o.id) AS order_count,
COUNT(DISTINCT o.customer_id) AS unique_customers,
SUM(o.total_amount) AS total_revenue
FROM orders o
WHERE o.created_at BETWEEN $1 AND $2
AND o.status = $3
GROUP BY DATE(o.created_at)
ORDER BY order_date DESC
"""
[[tools.parameters]]
name = "start_date"
type = "string"
description = "開始日(YYYY-MM-DD形式)"
[[tools.parameters]]
name = "end_date"
type = "string"
description = "終了日(YYYY-MM-DD形式)"
[[tools.parameters]]
name = "status"
type = "string"
description = "注文ステータス"
allowed_values = ["pending", "completed", "cancelled", "refunded"]
|
カスタムツールの使用#
カスタムツールを定義すると、Claude Codeから直接呼び出せます。
1
|
> example.comドメインのユーザーを20件検索して
|
Claude Codeはsearch_users_by_emailカスタムツールを使用し、パラメータ検証を行った上でクエリを実行します。
セキュリティのベストプラクティス#
データベースをAIツールに接続する際は、セキュリティに十分注意が必要です。
読み取り専用アカウントの使用#
本番データベースに接続する場合は、必ず読み取り専用のデータベースアカウントを使用してください。
1
2
3
4
5
6
7
|
-- PostgreSQLでの読み取り専用ロール作成例
CREATE ROLE readonly_user WITH LOGIN PASSWORD 'secure_password';
GRANT CONNECT ON DATABASE myapp TO readonly_user;
GRANT USAGE ON SCHEMA public TO readonly_user;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO readonly_user;
|
DBHubの読み取り専用モード設定#
1
2
3
4
5
|
[[tools]]
name = "execute_sql"
source = "production"
readonly = true # 書き込み操作を禁止
max_rows = 1000 # 結果行数を制限
|
SSHトンネルの使用#
本番データベースへの接続にはSSHトンネルを使用することを推奨します。
1
2
3
4
5
6
7
8
9
|
[[sources]]
id = "production"
dsn = "postgres://user:pass@database.internal:5432/mydb"
# SSHトンネル設定
ssh_host = "bastion.example.com"
ssh_port = 22
ssh_user = "deploy"
ssh_key = "~/.ssh/production_key"
|
機密情報の取り扱い#
DSN内のパスワードなどの機密情報は、環境変数で管理することを推奨します。
1
2
3
4
5
6
7
|
# 環境変数でDSNを設定
export DATABASE_URL="postgres://user:password@localhost:5432/dbname"
# DBHubの起動時に環境変数を使用
claude mcp add --transport stdio dbhub -- npx @bytebase/dbhub@latest \
--transport stdio \
--dsn "$DATABASE_URL"
|
トラブルシューティング#
接続エラーの対処#
接続エラーが発生した場合は、以下を確認してください。
1
2
3
4
5
6
7
8
9
10
11
|
[エラー] Connection refused
原因:
- データベースサーバーが起動していない
- ホスト名またはポート番号が間違っている
- ファイアウォールで接続がブロックされている
対処:
1. データベースサーバーの起動確認
2. DSN内のホスト名とポート番号を確認
3. ネットワーク接続を確認
|
認証エラーの対処#
1
2
3
4
5
6
7
8
9
|
[エラー] Authentication failed
原因:
- ユーザー名またはパスワードが間違っている
- ユーザーにデータベースへの接続権限がない
対処:
1. DSN内の認証情報を確認
2. データベースユーザーの権限を確認
|
DBHubが表示されない場合#
Claude Code内で/mcpを実行してもDBHubが表示されない場合は以下を確認します。
1
2
3
4
5
6
7
8
|
# MCPサーバー一覧を確認
claude mcp list
# DBHubを再追加
claude mcp remove dbhub
claude mcp add --transport stdio dbhub -- npx @bytebase/dbhub@latest \
--transport stdio \
--dsn "your-connection-string"
|
まとめ#
本記事では、DBHub MCPサーバーを使用してClaude Codeからデータベースを操作する方法を解説しました。
- DBHub MCPサーバーのセットアップ方法と複数の接続オプション
- 自然言語によるSQLクエリ生成と実行
- スキーマ分析と設計改善の提案依頼
- マイグレーションファイルの作成支援
- 複数データベースの同時接続とカスタムツールの定義
- セキュリティのベストプラクティス
DBHub MCPサーバーを活用することで、データベース操作の効率が大幅に向上します。特に、スキーマの理解が必要な場面や、複雑なSQLクエリの作成、マイグレーションの設計において、Claude Codeの支援は非常に有効です。
まずはデモモードで機能を試し、実際のプロジェクトで活用してみてください。
参考リンク#