#PostgreSQL MCP คืออะไร

PostgreSQL MCP Server เป็นตัวกลางตามมาตรฐาน Model Context Protocol (MCP) ที่เปิดเครื่องมือให้ AI Assistant ตรวจสอบโครงสร้างฐานข้อมูลและเรียกใช้ SQL ผ่านสิทธิ์ที่กำหนด โดยไม่จำเป็นต้องให้โมเดลเชื่อมต่อฐานข้อมูลโดยตรง

flowchart LR
  U[ผู้ใช้] --> A[AI Assistant / MCP Client]
  A <-->|MCP stdio| M[PostgreSQL MCP Server]
  M -->|SQL / Metadata| P[(PostgreSQL)]
  P -->|Rows / Schema| M
  M -->|Tool Result| A

#ประโยชน์

  • ค้นหาตาราง คอลัมน์ และความสัมพันธ์จากภาษาธรรมชาติ
  • สรุปข้อมูลด้วย SQL โดยให้ AI ช่วยสร้างคำสั่ง
  • วิเคราะห์ประสิทธิภาพคำสั่ง SQL และแผน EXPLAIN
  • ใช้เป็นเครื่องมือข้อมูลสำหรับ AI Agent และระบบวิเคราะห์ภายในองค์กร

#Workshop: PostgreSQL + MCP + VS Code

#1. สิ่งที่ต้องเตรียม

  • Docker และ Docker Compose
  • Node.js 22 ขึ้นไป สำหรับ MCP Server ตัวอย่างนี้
  • VS Code พร้อม MCP Client ที่รองรับ (เช่น GitHub Copilot Chat)

#2. เริ่ม PostgreSQL ด้วย Docker Compose

สร้าง compose.yaml:

services:
  postgres:
    image: postgres:17
    environment:
      POSTGRES_DB: shopdb
      POSTGRES_USER: app_admin
      POSTGRES_PASSWORD: dev_password_change_me
    ports:
      - "127.0.0.1:5432:5432"
    volumes:
      - pgdata:/var/lib/postgresql/data
volumes:
  pgdata:

เริ่มบริการ:

docker compose up -d

รหัสผ่านนี้ใช้สำหรับห้องปฏิบัติการในเครื่องเท่านั้น ห้ามนำไปใช้จริง

#3. สร้างตารางและข้อมูลตัวอย่าง

docker compose exec -T postgres psql -U app_admin -d shopdb <<'SQL'
CREATE TABLE IF NOT EXISTS products (
  id BIGSERIAL PRIMARY KEY,
  name TEXT NOT NULL,
  category TEXT NOT NULL,
  price NUMERIC(10,2) NOT NULL CHECK (price >= 0)
);
INSERT INTO products (name, category, price) VALUES
 ('Keyboard', 'Accessories', 990),
 ('Mouse', 'Accessories', 490),
 ('Monitor', 'Display', 4990);
SQL

#4. สร้างบัญชีอ่านข้อมูลอย่างเดียว

docker compose exec -T postgres psql -U app_admin -d shopdb <<'SQL'
CREATE ROLE mcp_reader LOGIN PASSWORD 'reader_password_change_me';
GRANT CONNECT ON DATABASE shopdb TO mcp_reader;
GRANT USAGE ON SCHEMA public TO mcp_reader;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO mcp_reader;
ALTER DEFAULT PRIVILEGES FOR ROLE app_admin IN SCHEMA public
  GRANT SELECT ON TABLES TO mcp_reader;
ALTER ROLE mcp_reader SET default_transaction_read_only = on;
SQL

#5. กำหนด MCP ใน VS Code

สร้างไฟล์ .vscode/mcp.json ในโฟลเดอร์โปรเจกต์:

{
  "servers": {
    "postgres": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@yawlabs/postgres-mcp@latest"],
      "env": {
        "DATABASE_URL": "postgres://mcp_reader:reader_password_change_me@127.0.0.1:5432/shopdb",
        "POSTGRES_STATEMENT_TIMEOUT_MS": "10000",
        "POSTGRES_MAX_ROWS": "100"
      }
    }
  }
}

บน Windows หาก npx เปิดไม่ได้ ให้ใช้ "command": "cmd" และ "args": ["/c", "npx", "-y", "@yawlabs/postgres-mcp@latest"] แทน

อย่า commit รหัสผ่านใน .vscode/mcp.json ขึ้น Git ให้ใช้ไฟล์ local ที่ไม่ติดตามด้วย Git หรือ secret/environment management ตามที่ MCP Client รองรับ

#6. เริ่มใช้งาน

เปิด MCP Server จากเมนู/คำสั่ง MCP ใน VS Code และอนุมัติการเชื่อมต่อ จากนั้นเปิด Copilot Chat ใน Agent mode และทดลองคำสั่ง:

  1. แสดงรายชื่อตารางในฐานข้อมูล shopdb
  2. อธิบายโครงสร้างตาราง products
  3. แสดงสินค้าที่ราคาเกิน 500 บาท โดยใช้เครื่องมือ PostgreSQL MCP
  4. สรุปราคาเฉลี่ยของสินค้าแยกตาม category
  5. ช่วยอธิบาย EXPLAIN ของ SELECT * FROM products WHERE price > 500

ตัวอย่าง SQL ที่คาดว่าจะถูกสร้าง:

SELECT category, ROUND(AVG(price), 2) AS avg_price
FROM products
GROUP BY category
ORDER BY category;

#7. ตรวจสอบความปลอดภัย

ลองขอให้ Agent รัน DELETE FROM products; โดยใช้บัญชี mcp_reader คำสั่งต้องถูกปฏิเสธ เนื่องจากไม่ได้รับสิทธิ์ DELETE และกำหนด default transaction เป็น read-only

แนวปฏิบัติที่แนะนำ: จำกัดสิทธิ์เป็นราย schema/table, ใช้ฐานข้อมูลทดสอบหรือ read replica, กำหนด statement timeout, ไม่เปิดเผยข้อมูลส่วนบุคคลในผลลัพธ์, ตรวจสอบคำสั่ง SQL ที่ Agent จะเรียกใช้ และไม่เปิด ALLOW_WRITES=1 โดยไม่จำเป็น

#หมายเหตุเกี่ยวกับ MCP Server

ตัวอย่างใช้โครงการชุมชน @yawlabs/postgres-mcp ไม่ใช่เซิร์ฟเวอร์ PostgreSQL MCP อย่างเป็นทางการจาก PostgreSQL โครงการตัวอย่างเก่า @modelcontextprotocol/server-postgres อยู่ในคลัง archived แล้ว จึงควรประเมินการบำรุงรักษาและความปลอดภัยก่อนใช้งานจริง

#แหล่งอ้างอิง