😉

MCPサーバーを使ってClaudeからPostgreSQLを操作する方法

に公開

MCPサーバーとは

MCPサーバー(Model Context Protocol)は、AIツールのプロンプトから他のツールを操作し、データのCRUD処理を行うためのプロトコルです。
AIアシスタントがデータベースなどの外部システムと直接やり取りできるようにする仕組みです。


Claude DesktopでPostgreSQLのMCPサーバーを使う手順

前提条件

  • Claude Desktopがインストール済み
  • Docker Desktopがインストール済み

1. DockerでPostgreSQLを設定する

まず、必要なディレクトリとファイルを作成します:

mkdir postgres-docker
cd postgres-docker
touch docker-compose.yml

docker-compose.yml に以下の内容を記述します:

version: '3'
services:
  db:
    image: postgres:14
    container_name: postgres_pta
    ports:
      - 5432:5432
    volumes:
      - db-store:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: 'user'
      POSTGRES_PASSWORD: 'postgres'

volumes:
  db-store:

次に、Dockerコンテナを起動します:

docker compose up -d

2. データベースにテストデータを登録する

お好みのDBクライアント(例:TablePlus)でPostgreSQLに接続し、サンプルの書店データベーススキーマとデータを作成します。

接続情報:

  • ホスト: localhost
  • ポート: 5432
  • ユーザー名: user
  • パスワード: postgres
  • データベース: user

以下サンプルデータになります。

-- PostgreSQL書店データベースダンプ
-- 作成日: 2025-04-09

-- テーブル削除(存在する場合)
DROP TABLE IF EXISTS order_details;
DROP TABLE IF EXISTS orders;
DROP TABLE IF EXISTS books;
DROP TABLE IF EXISTS customers;
DROP TABLE IF EXISTS publishers;

-- 出版社テーブル
CREATE TABLE publishers (
    publisher_id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    address VARCHAR(200),
    phone VARCHAR(20),
    email VARCHAR(100),
    founded_year INTEGER
);

-- 顧客テーブル
CREATE TABLE customers (
    customer_id SERIAL PRIMARY KEY,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    phone VARCHAR(20),
    address VARCHAR(200),
    registration_date DATE DEFAULT CURRENT_DATE
);

-- 書籍テーブル
CREATE TABLE books (
    book_id SERIAL PRIMARY KEY,
    title VARCHAR(200) NOT NULL,
    author VARCHAR(100) NOT NULL,
    publisher_id INTEGER REFERENCES publishers(publisher_id),
    publication_date DATE,
    isbn VARCHAR(20) UNIQUE,
    price DECIMAL(10, 2) NOT NULL,
    stock_quantity INTEGER DEFAULT 0,
    genre VARCHAR(50),
    description TEXT
);

-- 注文テーブル
CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    customer_id INTEGER REFERENCES customers(customer_id),
    order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    total_amount DECIMAL(12, 2) NOT NULL,
    status VARCHAR(20) DEFAULT 'pending',
    shipping_address VARCHAR(200),
    payment_method VARCHAR(50)
);

-- 注文詳細テーブル
CREATE TABLE order_details (
    order_detail_id SERIAL PRIMARY KEY,
    order_id INTEGER REFERENCES orders(order_id),
    book_id INTEGER REFERENCES books(book_id),
    quantity INTEGER NOT NULL,
    unit_price DECIMAL(10, 2) NOT NULL,
    subtotal DECIMAL(10, 2) NOT NULL
);

-- サンプルデータの挿入
-- 出版社データ
INSERT INTO publishers (name, address, phone, email, founded_year) VALUES
('技術書出版', '東京都中央区銀座1-1-1', '03-1234-5678', 'info@gijutsu-pub.co.jp', 1985),
('文学出版社', '京都府京都市中京区寺町通御池上る', '075-123-4567', 'contact@bungaku-pub.com', 1972),
('学術図書', '大阪府大阪市北区梅田3-1-3', '06-2345-6789', 'academic@books.co.jp', 1990),
('グローバル出版', '東京都新宿区西新宿2-8-1', '03-3456-7890', 'global@publisher.com', 2001),
('デジタルブックス', '神奈川県横浜市西区みなとみらい2-3-5', '045-678-9012', 'info@digital-books.jp', 2010);

-- 顧客データ
INSERT INTO customers (first_name, last_name, email, phone, address, registration_date) VALUES
('太郎', '山田', 'taro.yamada@example.com', '090-1234-5678', '東京都世田谷区世田谷1-1-1', '2023-01-15'),
('花子', '佐藤', 'hanako.sato@example.com', '080-2345-6789', '大阪府大阪市中央区心斎橋2-2-2', '2023-02-20'),
('一郎', '鈴木', 'ichiro.suzuki@example.com', '070-3456-7890', '愛知県名古屋市中区栄3-3-3', '2023-03-10'),
('恵子', '田中', 'keiko.tanaka@example.com', '090-4567-8901', '福岡県福岡市博多区博多4-4-4', '2023-04-05'),
('健太', '伊藤', 'kenta.ito@example.com', '080-5678-9012', '北海道札幌市中央区大通5-5-5', '2023-05-12'),
('美香', '渡辺', 'mika.watanabe@example.com', '070-6789-0123', '東京都新宿区新宿6-6-6', '2023-06-25'),
('直樹', '高橋', 'naoki.takahashi@example.com', '090-7890-1234', '神奈川県横浜市西区7-7-7', '2023-07-30'),
('幸子', '加藤', 'sachiko.kato@example.com', '080-8901-2345', '京都府京都市下京区8-8-8', '2023-08-18');

-- 書籍データ
INSERT INTO books (title, author, publisher_id, publication_date, isbn, price, stock_quantity, genre, description) VALUES
('PostgreSQL実践入門', '佐藤一郎', 1, '2023-05-10', '978-4-1234-5678-1', 3800, 25, 'コンピュータ', 'PostgreSQLのインストールから高度な使い方までを解説した実践書'),
('日本文学の潮流', '鈴木文子', 2, '2022-11-15', '978-4-2345-6789-2', 2600, 18, '文学', '明治から現代までの日本文学の流れを概観した研究書'),
('データベース設計の基礎と応用', '高橋正幸', 1, '2024-01-20', '978-4-3456-7890-3', 4200, 30, 'コンピュータ', 'リレーショナルデータベースの設計手法を初心者から実務者まで段階的に解説'),
('宇宙の謎を解く', '伊藤誠', 3, '2023-09-05', '978-4-4567-8901-4', 3200, 12, '科学', '最新の宇宙物理学の発見と理論をわかりやすく解説した一般向け科学書'),
('グローバル経済入門', '渡辺貴子', 4, '2024-02-28', '978-4-5678-9012-5', 2800, 20, '経済', '国際経済の仕組みと課題を学べる入門書'),
('AI時代の哲学', '田中哲也', 3, '2023-07-12', '978-4-6789-0123-6', 3600, 15, '哲学', '人工知能の発展が投げかける哲学的な問いを考察した一冊'),
('デジタルマーケティング戦略', '中村健太', 5, '2024-03-15', '978-4-7890-1234-7', 3400, 22, 'ビジネス', 'オンラインビジネスにおける最新のマーケティング手法を網羅'),
('日本史再考', '木村史郎', 2, '2023-10-20', '978-4-8901-2345-8', 4000, 10, '歴史', '新しい視点から日本の歴史を見直す研究書'),
('プログラミング言語比較', '林賢一', 1, '2023-12-05', '978-4-9012-3456-9', 4500, 28, 'コンピュータ', '主要なプログラミング言語の特徴と使い分けを解説'),
('健康生活の科学', '山本医子', 3, '2024-01-10', '978-4-0123-4567-0', 2900, 16, '健康', '最新の医学研究に基づいた健康的な生活習慣の提案'),
('現代建築の潮流', '岡田建人', 4, '2023-08-25', '978-4-1234-5678-2', 5200, 8, '芸術', '20世紀後半から現代までの建築様式の変遷を豊富な写真で紹介'),
('効率的な学習法', '小林教授', 5, '2024-02-10', '978-4-2345-6789-3', 2500, 35, '教育', '認知科学に基づいた効果的な学習テクニックを紹介');

-- 注文データ
INSERT INTO orders (customer_id, order_date, total_amount, status, shipping_address, payment_method) VALUES
(1, '2024-01-15 10:30:00', 7600, 'completed', '東京都世田谷区世田谷1-1-1', 'credit_card'),
(2, '2024-01-18 15:45:00', 3200, 'completed', '大阪府大阪市中央区心斎橋2-2-2', 'bank_transfer'),
(3, '2024-02-05 12:20:00', 8700, 'shipped', '愛知県名古屋市中区栄3-3-3', 'credit_card'),
(1, '2024-02-20 09:15:00', 2900, 'completed', '東京都世田谷区世田谷1-1-1', 'credit_card'),
(4, '2024-03-10 14:30:00', 6800, 'pending', '福岡県福岡市博多区博多4-4-4', 'convenience_store'),
(5, '2024-03-15 18:45:00', 9600, 'shipped', '北海道札幌市中央区大通5-5-5', 'credit_card'),
(2, '2024-03-25 11:10:00', 4500, 'completed', '大阪府大阪市中央区心斎橋2-2-2', 'bank_transfer'),
(6, '2024-04-02 16:30:00', 7400, 'pending', '東京都新宿区新宿6-6-6', 'credit_card');

-- 注文詳細データ
INSERT INTO order_details (order_id, book_id, quantity, unit_price, subtotal) VALUES
(1, 1, 1, 3800, 3800), -- 山田太郎の注文1冊目
(1, 3, 1, 3800, 3800), -- 山田太郎の注文2冊目
(2, 7, 1, 3200, 3200), -- 佐藤花子の注文
(3, 2, 1, 2600, 2600), -- 鈴木一郎の注文1冊目
(3, 10, 1, 2900, 2900), -- 鈴木一郎の注文2冊目
(3, 9, 1, 3200, 3200), -- 鈴木一郎の注文3冊目
(4, 10, 1, 2900, 2900), -- 山田太郎の2回目の注文
(5, 4, 1, 3200, 3200), -- 田中恵子の注文1冊目
(5, 8, 1, 3600, 3600), -- 田中恵子の注文2冊目
(6, 11, 1, 5200, 5200), -- 伊藤健太の注文1冊目
(6, 3, 1, 4400, 4400), -- 伊藤健太の注文2冊目
(7, 9, 1, 4500, 4500), -- 佐藤花子の2回目の注文
(8, 7, 1, 3400, 3400), -- 渡辺美香の注文1冊目
(8, 5, 1, 4000, 4000); -- 渡辺美香の注文2冊目

-- サンプルビュー作成
CREATE VIEW top_selling_books AS
SELECT b.book_id, b.title, b.author, b.genre, SUM(od.quantity) as total_sold
FROM books b
JOIN order_details od ON b.book_id = od.book_id
GROUP BY b.book_id, b.title, b.author, b.genre
ORDER BY total_sold DESC;

CREATE VIEW customer_purchase_summary AS
SELECT c.customer_id, c.first_name, c.last_name, c.email,
       COUNT(DISTINCT o.order_id) as total_orders,
       SUM(o.total_amount) as total_spent
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id
GROUP BY c.customer_id, c.first_name, c.last_name, c.email
ORDER BY total_spent DESC;

-- インデックス作成
CREATE INDEX idx_books_publisher ON books(publisher_id);
CREATE INDEX idx_books_genre ON books(genre);
CREATE INDEX idx_orders_customer ON orders(customer_id);
CREATE INDEX idx_orders_status ON orders(status);
CREATE INDEX idx_order_details_order ON order_details(order_id);
CREATE INDEX idx_order_details_book ON order_details(book_id);

3. Claude DesktopでMCPサーバーを設定する

  1. Claude Desktopを開く
  2. 左上の「Claude > 設定... > 開発者 > 構成を編集」をクリック
  3. claude_desktop_config.json を以下のように編集:
{
  "mcpServers": {
    "postgres": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "mcp/postgres",
        "postgresql://user:postgres@host.docker.internal:5432/user"
      ]
    }
  }
}

これで、Dockerで実行中のPostgreSQLのuserデータベースに接続できるようになります。


実際の利用例

設定完了後、Claudeに対して以下のようにSQL文を実行するよう依頼できます:

  • booksテーブルの内容を表示して」
  • 「特定のタイトルの本の情報を検索して」
  • 「売上上位の書籍を教えて」

Claudeは直接データベースにアクセスして、結果を返してくれます。

こんな感じです。


まとめ

MCPサーバーの登場により、AIのプロンプトから様々なシステム操作が可能になりつつあります。
今後は多くのエンジニアがMCPサーバーを開発し、AIと外部システムの連携がより一層進むでしょう。

AIの進化は早いため、最新情報のインプットを継続することが重要です。


参考リソース


Discussion