1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude Desktop + データベース系MCPサーバーDBHub で自然言語でDB操作してみた

1
Posted at

初めに

今回はMCPを使い日本語のみでDB操作をしてみたいと思います。
MCPサーバーには DBHub を使ってみます。

DBHubとは

MySQL, PostgreSQL, SQL Server, MariaDB, SQLite と複数のデータベースに接続可能なMCPサーバーです。
https://github.com/bytebase/dbhub

データベース系MCPサーバーはいくつか世に出ていますが、MySQLのものはMySQL公式からもAnthropicからも出ていないので非公式のものを使う他ありません。が、このDBHubはGitHub厳選MCPサーバー集にも載っているので素性の怪しいものではない・・・筈。多分。


環境構築

必要なものは以下の通りです。

  • MCPクライアント(今回は Claude Desktop Windows版 を使用)
  • Node
  • python

ここでNodeは新しすぎるとダメな場合があるようです。
2026年2月現在で最新のLTS版(24.13.0)では動作せず、20.20.0に下げたら動作しました。

Claude Desktop の設定方法

Claude Desktop の 「ファイル」>「設定」>「開発者」を開きます。
ここでローカルMCPサーバーを追加することができます。
「設定を編集」ボタンを押すとエクスプローラーが開き claude_desktop_config.json というファイルが選択された状態になるので、このファイルをテキストエディタで編集します。

claude_desktop_config.json 記入例

ここではローカルで起動しているMySQLを指定しています。

{
  "mcpServers": {
    "dbhub": {
      "command": "npx",
      "args": [
        "@bytebase/dbhub@latest",
        "--transport",
        "stdio",
        "--dsn",
        "mysql://app_user:app_password@localhost:3306/dbname"
      ]
    }
  }
}

書き換えたら Calude Desktop を再起動します。
他に読み込み直させる方法はないようです。めんどい。


動作例

テーブル定義

予めこんなテーブルを作成しておき、レコードを入れておきました。

CREATE TABLE `customers` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `email` varchar(255) COLLATE utf8mb4_general_ci NOT NULL,
  `name` varchar(100) COLLATE utf8mb4_general_ci NOT NULL,
  `gender` char(1) COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'X',
  `phone` varchar(20) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=50001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
CREATE TABLE `orders` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `customer_id` bigint unsigned NOT NULL,
  `order_number` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
  `status` enum('pending','paid','shipped','completed','canceled') COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'pending',
  `total_amount` int NOT NULL COMMENT '注文合計金額',
  `ordered_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `order_number` (`order_number`),
  KEY `fk_orders_customer` (`customer_id`),
  CONSTRAINT `fk_orders_customer` FOREIGN KEY (`customer_id`) REFERENCES `customers` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=106473 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci

動作させてみる

「顧客テーブルの性別内訳を教えて」と指示してみました。
するとまずテーブルの構成を確認するための許可を求めてきました。
query1.png

何にも言ってないのに顧客テーブルが customers だと突き止めました。
次に目当てのテーブルのカラム定義を確認し、
query2.png

算出するSQLを提示し実行許可を求めてきます。
query3.png

結果が出ました。
query4.png

ここで gender カラムには M/F/X という3種類の文字列を入れているのですが、何も言っていなくてもAIが値を解釈してくれています。

資料化させてみる

せっかく内訳を出してみたのでそのままグラフ化させてみましょう。
query9.png

複数テーブルを跨る操作

今度はもう少し複雑な指示です。複数テーブルを参照するような指示をしてみましょう。

query5.png

一旦SQLを出力した後でカラム定義を確認しています。
恐らく orders テーブルが初出のためでしょう。
最初に全テーブルの定義を読み込ませたりすると良いのかもしれませんね。
query6.png

カラム名が違っていたのでSQLが修正され、
query7.png

結果が出ました。
query8.png


所感

エンジニアは基本的にSQLぐらい使えるので革命的に便利になった、とまでは言えないと思います。
が、それ以上に非エンジニアにとってデータベースへの敷居が低くなったのではないでしょうか。
エンジニアの力を借りずとも、例えばカスタマーサポートがお客さんからの問い合わせに対しちょっとしたデータベース調査したり、営業担当がデータを元に提案資料作ったりが捗りそうです。
今後はそういう使い方が当たり前になってくるんでしょうかね。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?