DifyとMCPを組み合わせて自然言語でDBの内容を分析するAIエージェントを作る

AI

はじめに

Dify に MCP を組み合わせることで、人間が行っていた作業をAIエージェントに代行させることができます。
今回は、Dify と crystaldba/postgres-mcp を組み合わせて、自然言語で架空の書店の在庫・売上データを分析し、仕入れ提案を行うエージェントの構築手順を紹介します。

注意事項

  • MCP と組み合わせることでAIエージェントにより強い権限を渡すことになります。セキュリティには十分注意してください。
  • Dify や MCP へのアクセス管理は適切に行い、外部に公開しないようにしてください。

前提

  • Dify バージョン: 1.13.0
  • Dify の以下の設定が事前に完了していること
  • AIモデルの追加
  • Agent Strategies のインストール

アーキテクチャ概要

[Dify エージェント] --SSE--> [postgres-mcp コンテナ] --> [PostgreSQL コンテナ]

Dify のエージェントがツールとして postgres-mcp を呼び出し、MCP がSQL実行などのデータベース操作を代行します。DifyとMCPは同一のDockerネットワーク上に置くことで通信できるようにします。

手順

1. Dify を Docker Compose で起動する

公式手順に従い Dify を起動します。起動後、管理画面にログインできることを確認してください。

2. PostgreSQL と postgres-mcp の docker-compose.yml を作成する

任意のディレクトリに docker-compose.yml を作成します。

services:
  postgres:
    image: postgres:17
    container_name: dummy_bookstore_db
    restart: unless-stopped
    environment:
      POSTGRES_USER: bookstore
      POSTGRES_PASSWORD: bookstore_pass
      POSTGRES_DB: bookstore_db
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data
      - ./seed.sql:/docker-entrypoint-initdb.d/seed.sql # データ投入用のSQLファイルをマウント
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U bookstore -d bookstore_db"]
      interval: 10s
      timeout: 5s
      retries: 5

  mcp:
    image: crystaldba/postgres-mcp
    environment:
      - DATABASE_URI=postgresql://bookstore:bookstore_pass@localhost:5432/bookstore_db
    ports:
      - "8000:8000"
    networks:
      - docker_ssrf_proxy_network
      - default
    # DifyのMCP仕様に対応するため、MCPはSSEモードで起動
    command: --transport=sse

volumes:
  postgres_data:

networks:
  docker_ssrf_proxy_network: # Difyのネットワーク
    external: true

設定のポイントは2つあります。

  • docker_ssrf_proxy_networkmcp サービスを接続する
    Dify が起動するネットワークに MCP を参加させることで、Dify コンテナ内から http://mcp:8000 へアクセスできるようになります。
  • MCP は SSEモード(--transport=sse)で起動する
    Dify のツール統合は http 接続での使用のみ対応しているため、MCPをSSEモードで起動する必要があります。

3. ダミーデータを seed.sql に記述する

書店の売上・在庫データを模擬した seed.sql を同じディレクトリに作成します。商品テーブルや売上履歴テーブルなど、検証に必要なデータを投入してください。

4. コンテナを起動する

docker compose up -d

5. Dify で MCP ツールを追加する

「ツール」タブから MCP ツールを新規追加します。エンドポイントには以下を指定します。

http://mcp:8000/sse
  • mcp は docker-compose.yml 内のサービス名
  • 8000 は MCP のポート
  • /sse は SSEモードのエンドポイントパス

6. エージェントアプリを作成する

Dify のスタジオで新規アプリ作成から「エージェント」タイプのアプリを作成し、手順 5 で追加した MCP ツールをエージェントのツールとして有効化します。

7. エージェントにシステムプロンプトを設定する

あなたは書店の仕入れ担当です。
在庫管理システムのデータベースを閲覧し、ユーザーからの質問に回答してください。
データベースを閲覧する際は与えられたツールを使用してください。

動作確認

エージェントに以下の質問を投げてみます。

直近1か月の売り上げ情報を確認し、来月の仕入れ予定を計画してください。

エージェントは MCP ツールを呼び出してSQLを実行し、以下のような回答を返しました(抜粋)。


承知しました。まず直近1か月(過去30日間)の販売実績を確認し、その結果をもとに来月の仕入れ方針(暫定)を提案します。

直近1か月の概要(上位商品)

タイトル30日販売数売上在庫日平均
19849冊116.912000.30
The Fellowship of the Ring6冊101.944000.20
Norwegian Wood6冊83.942000.20
Kafka on the Shore4冊63.961800.13
The Two Towers3冊50.973800.10
Never Let Me Go0冊0900
The Remains of the Day0冊0800

在庫・販売速度から見たポイント

  • 上位商品の多くは現在の在庫が販売スピードに対して十分〜過剰な状態です。
  • Never Let Me Go / The Remains of the Day のように売上ゼロのタイトルは在庫過剰の可能性があり、棚替えや販促を検討すべきです。
  • 売れ筋の「1984」は安定して売れていますが、在庫200に対して月9冊ペースのため短期的な追加仕入れは不要です。

来月の暫定仕入れ方針

発注点の目安(リードタイム14日 + 安全在庫7日で試算):

  • 日平均 = 過去30日の販売数 ÷ 30
  • 発注点 ≒ 日平均 × 21日
    (例:1984 → 0.30 × 21 ≒ 7冊)

現状では全主要商品で在庫が発注点を大きく上回っているため、今月の追加発注は不要です。ただし、各タイトルに発注点を設定してアラートを運用することを推奨します。


自然言語の指示だけでAIエージェントが自律的にSQLを実行し、データを分析して回答できていることがわかります。

まとめ

今回は Dify と Postgres MCP を組み合わせて、自然言語でデータベースを操作するAIエージェントの構築手順を紹介しました。
組み合わせる MCP 次第で今回のようなデータベース連携意外にも様々な仕事をAIエージェントに代行させることができます。
ぜひ色々なツールと組み合わせて試してみてください。

コメント

タイトルとURLをコピーしました