【リモートMCP】Difyチャット経由でAIにデータベース操作させる方法【閉鎖環境なので業務利用OK!】
【リモートMCP】Difyチャット経由でAIにデータベース操作させる方法【閉鎖環境なので業務利用OK!】
はじめに
今回はGithubで公開されていた bytebase/dbhub (MCPサーバー)を使い、AI に PostgreSQL を操作させる方法を解説します。
SaaS 版 Dify を利用する場合は、MCPサーバー側のFW(今回はAWSのEC2のセキュリティグループ)で SaaS の送信元を許可しなければならないと思います。(試していませんので違ったらすみません。)
この記事ではEC2 内でDify / dbhub(MCPサーバー) / PostgreSQL をDockerで稼働 させる方式を紹介します。
OpenAI プラットフォームのデータ制御にある通りAPI経由であればモデル学習に使われる心配はありません。(記事投稿時点)
Your data is your data. As of March 1, 2023, data sent to the OpenAI API is not used to train or improve OpenAI models (unless you explicitly opt in to share data with us).
できること
AIがデータベースへの登録や内容の表示をしてくれる
前提条件
この記事の手順を試すためには以下の環境が必要です。
多くてすみませんが解説記事は溢れていると思うので、各々でご準備お願いします。
- Amazon EC2 インスタンス が作成されていること
- Docker / Docker Compose v2 / Git の各コマンドが利用可能であること
- OpenAIのAPIキー を発行済みであること
環境
ディレクトリ構成例:
projects/
├─ dify/ # セルフホスト Dify
├─ dbhub/ # dbhub MCP サーバー
└─ postgres-docker/ # PostgreSQL コンテナ
実行中コンテナ例:
$ docker ps
xxxxxxxxxxxx bytebase/dbhub:latest 0.0.0.0:8080->8080/tcp dbhub
xxxxxxxxxxxx postgres:15-alpine 0.0.0.0:6543->5432/tcp postgres_dbhub
... (Dify 関連コンテナ群)
構成イメージ:
設定手順
PostgreSQLの準備
ec2にログイン後、作業ディレクトリを作成して移動
cd ~
mkdir projects
cd postgres-docker/
mkdir postgres-docker
cd postgres-docker/
PostgreSQL用のコンテナ起動
設定ファイル作成:
nano docker-compose.yml
既に5432ポートを使っている場合は「"6543:5432"」のように書き換えてください。
services:
database:
image: postgres:15-alpine
container_name: postgres_dbhub
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
POSTGRES_DB: database
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
起動:
docker compose up -d
dbhub(MCPサーバー)の準備
ディレクトリを作成しGitリポジトリをクローン
cd ~
cd projects
git clone https://github.com/bytebase/dbhub.git
cd dbhub/
dbhub用のコンテナ起動
設定ファイル作成:
nano docker-compose.yml
services:
dbhub:
image: bytebase/dbhub:latest
container_name: dbhub
ports:
- "8080:8080"
environment:
- DBHUB_LOG_LEVEL=info
command:
- --transport
- http
- --port
- "8080"
- --dsn
- "postgres://postgres:password@172.31.30.25:5432/postgres?sslmode=disable"
172.31.30.25
は EC2 のプライベート IP。
compose ネットワークを使わず IP アドレスで直接接続しています。
起動:
docker compose up -d
ログ例:
$ docker logs dbhub
Connecting with DSN: postgres://postgres:*******@172.31.30.25:5432/postgres?sslmode=disable
DSN source: command line argument
Successfully connected to PostgreSQL database
Using transport: http
Transport source: command line argument
_____ ____ _ _ _
| __ \| _ \| | | | | |
| | | | |_) | |_| |_ _| |__
| | | | _ <| _ | | | | '_ \
| |__| | |_) | | | | |_| | |_) |
|_____/|____/|_| |_|\__,_|_.__/
v0.11.4 - Universal Database MCP Server
Port source: command line argument
DBHub server listening at http://0.0.0.0:8080
Connect to MCP server at http://0.0.0.0:8080/message
MCPの動作確認 (curlでjsonrpcを投げる)
この項目は読み飛ばしても大丈夫です。
初期化(initialize):
curl -X POST http://172.31.30.25:8080/message \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "0.1.0",
"capabilities": {},
"clientInfo": {
"name": "curl",
"version": "0.0.1"
}
}
}' | grep '^data:' | cut -d' ' -f2- | jq
成功のレスポンス例:
{
"result": {
"protocolVersion": "2025-03-26",
"capabilities": {
"resources": {
"listChanged": true
},
"completions": {},
"tools": {
"listChanged": true
},
"prompts": {
"listChanged": true
}
},
"serverInfo": {
"name": "DBHub MCP Server",
"version": "0.11.4"
}
},
"jsonrpc": "2.0",
"id": 1
}
ツール表示(tools/list):
curl -s -X POST http://172.31.30.25:8080/message \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/list",
"params": {}
}' | grep '^data:' | cut -d' ' -f2- | jq
ツール表示:成功のレスポンス例:
{
"result": {
"tools": [
{
"name": "execute_sql",
"description": "Execute a SQL query on the current database",
"inputSchema": {
"type": "object",
"properties": {
"sql": {
"type": "string",
"description": "SQL query or multiple SQL statements to execute (separated by semicolons)"
}
},
"required": [
"sql"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
}
]
},
"jsonrpc": "2.0",
"id": 2
}
Difyの準備
ディレクトリを作成しGitリポジトリをクローン
cd ~
cd projects
git clone https://github.com/langgenius/dify.git
Dify用のコンテナ起動
cd dify
cd docker
cp .env.example .env
docker compose up -d
ブラウザでEC2のURLにアクセスし、初回起動時の管理アカウント設定
http://ec2-x-x-x-x.compute-1.amazonaws.com
Dify に MCP サーバーを登録
セルフホスト版 Dify の管理画面で Tools → MCP → Add MCP Server (HTTP) を選択し、次を入力します。
-
サーバーURL:
http://<EC2のIP>:8080/message
- その他は任意:
- タイムアウトはデフォルト:
保存後、Dify が dbhub MCP に接続し、execute_sql
ツールが利用可能になります。
「認証済み」になればOKです
チャットボットの作成
チャットボットの枠を作成:
エージェントを選択:
初心者向けの基本的なアプリタイプ > エージェント
モデルプロバイダー設定に移動する:
OpenAIのAPIキーの設定
プロバイダープラグインを導入:
APIキーの認証:
OpenAIのAPIキーの設定
プロンプト、モデル、ツールを設定し「公開する」:
参考プロンプト(なんでもいいです)
ユーザーの問い合わせに対応してください。
喋り方は関西弁で、年は34歳、明るくて冗談好きな性格です。
小さいころから笑点と吉本新喜劇を見て育ちました。
アプリを実行する、でチャット画面を開く:
Difyチャットで問い合わせDBを操作してもらう(ようやく!)
Dify チャットで問い合わせ
チャットでテーブル作成、登録、表示まで言われるがままに作業してくれます!
実際の登録内容とも一致!
postgres=# select * from test_table;
id | name | intro
----+------------+------------------------------------------------------------------------------------------------
2 | テスト |
1 | といちさん | VTuberもどきの動画投稿してます。 最近は仕事の関係で開発に興味津々。YouTubeも登録お願いします!
3 | おじさん | おじさんはちょっとお茶目な性格で、甘いものが大好きなんや。みんなに笑顔を届けたいと思ってます!
(3 rows)
まとめ
- dbhub を使って PostgreSQL を MCP サーバー化
- Dify (セルフホスト版) からリモート MCP に接続
- AI に DB を自然言語で操作させることが可能
✍️ この記事が参考になったら「いいね」「コメント」「フォロー」をお願いします
Discussion
知人から笑点は関西ではないという指摘をもらいました。
そうなんですね?