สวัสดีครับ ผมเป็นวิศวกรที่เพิ่งเริ่มเล่น MCP (Model Context Protocol) เมื่อไม่นานมานี้ หลังจากลองผิดลองถูกมาหลายวัน วันนี้ผมจะมาแชร์วิธีการสร้าง Postgres Query MCP Server ด้วย FastMCP แล้วเชื่อมต่อเข้ากับ Claude Desktop แบบง่าย ๆ ครับ ไม่ต้องมีพื้นฐาน API ก็ทำตามได้

FastMCP คืออะไร? ทำไมต้องใช้?

FastMCP เป็นเฟรมเวิร์ก Python ที่ช่วยให้เราสร้าง MCP Server ได้อย่างรวดเร็ว โดยไม่ต้องเขียนโปรโตคอลซับซ้อนเอง MCP เป็นมาตรฐานกลางที่ทำให้ Claude หรือ LLM อื่น ๆ สามารถเรียกใช้เครื่องมือภายนอกได้ เช่น การสอบถามฐานข้อมูล Postgres

ข้อดีของ FastMCP:

สิ่งที่ต้องเตรียมก่อนเริ่ม

ขั้นตอนที่ 1: ติดตั้งไลบรารีที่จำเป็น

เปิด Terminal แล้วรันคำสั่งนี้:

pip install fastmcp psycopg2-binary

ถ้าใช้ Postgres เวอร์ชันใหม่ แนะนำให้ติดตั้ง asyncpg เพิ่ม:

pip install asyncpg

ขั้นตอนที่ 2: เขียน MCP Server ด้วย FastMCP

สร้างไฟล์ชื่อ postgres_mcp.py แล้วใส่โค้ดนี้:

from fastmcp import FastMCP
import psycopg2
import os

mcp = FastMCP("PostgresQueryServer")

DB_CONFIG = {
    "host": os.getenv("DB_HOST", "localhost"),
    "port": int(os.getenv("DB_PORT", 5432)),
    "user": os.getenv("DB_USER", "postgres"),
    "password": os.getenv("DB_PASSWORD", "yourpassword"),
    "dbname": os.getenv("DB_NAME", "postgres"),
}

@mcp.tool()
def query_database(sql: str) -> list:
    """รันคำสั่ง SQL แบบ SELECT บนฐานข้อมูล Postgres แล้วคืนผลลัพธ์เป็น list ของ dict"""
    if not sql.strip().lower().startswith("select"):
        return [{"error": "อนุญาตเฉพาะคำสั่ง SELECT เท่านั้น"}]
    conn = psycopg2.connect(**DB_CONFIG)
    cur = conn.cursor()
    cur.execute(sql)
    cols = [d[0] for d in cur.description]
    rows = [dict(zip(cols, row)) for row in cur.fetchall()]
    cur.close()
    conn.close()
    return rows

@mcp.tool()
def list_tables() -> list:
    """แสดงรายชื่อตารางทั้งหมดในฐานข้อมูล"""
    return query_database(
        "SELECT table_name FROM information_schema.tables "
        "WHERE table_schema = 'public' ORDER BY table_name;"
    )

if __name__ == "__main__":
    mcp.run()

โค้ดนี้สร้าง MCP Server ที่มี 2 เครื่องมือ คือ query_database สำหรับรัน SQL และ list_tables สำหรับดูรายชื่อตาราง

ขั้นตอนที่ 3: ตั้งค่า Claude Desktop

เปิดไฟล์ claude_desktop_config.json บนเครื่องของคุณ:

{
  "mcpServers": {
    "postgres-query": {
      "command": "python",
      "args": ["/full/path/to/postgres_mcp.py"],
      "env": {
        "DB_HOST": "localhost",
        "DB_PORT": "5432",
        "DB_USER": "postgres",
        "DB_PASSWORD": "yourpassword",
        "DB_NAME": "postgres"
      }
    }
  }
}

รีสตาร์ท Claude Desktop แล้วลองพิมพ์ "แสดงตารางทั้งหมดในฐานข้อมูล" Claude จะเรียก MCP Server ของเราให้อัตโนมัติ

ขั้นตอนที่ 4: ทดสอบการทำงาน

ลองถาม Claude ว่า "หาจำนวนลูกค้าทั้งหมดในตาราง customers" ถ้าทำงานถูกต้อง Claude จะเรียก query_database แล้วส่ง SQL กลับมา

เปรียบเทียบราคาโมเดลผ่าน HolySheep AI (ข้อมูล 2026 ต่อ 1 ล้าน Token)

หลายคนอาจสงสัยว่าใช้ Claude Desktop แล้วโมเดลไหนคุ้มสุด ผมเลยรวบรวมราคา output จากแพลตฟอร์มต่าง ๆ ผ่าน HolySheep AI ซึ่งมีอัตรา 1 หยวน = 1 ดอลลาร์ ประหยัดได้มากกว่า 85% เมื่อเทียบกับราคาเต็ม:

ตัวอย่างการคำนวณต้นทุนรายเดือน: สมมติใช้ Claude Sonnet 4.5 ประมาณ 500,000 token/เดือน ผ่าน HolySheep จะเสีย $7.50 ขณะที่ถ้าใช้ DeepSeek V3.2 แทน เสียเพียง $0.21 ต่างกัน $7.29 ต่อเดือน หรือประหยัดได้เกือบ 97%

ข้อมูลคุณภาพ (Benchmark) — ความหน่วงต่ำกว่า 50ms

จากการทดสอบจริงของผมและข้อมูลจาก community:

HolySheep รองรับทั้ง WeChat Pay และ Alipay จ่ายง่าย สะดวก และเร็วกว่าการผูกบัตรเครดิต

ชื่อเสียงและรีวิวจากชุมชน

เมื่อดูความคิดเห็นจาก GitHub และ Reddit พบว่า:

ข้อผิดพลาดที่พบบ่อยและวิธีแก้ไข

1. Claude Desktop ไม่เห็น MCP Server

อาการ: เปิด Claude Desktop แล้วไม่มีไอคอนเครื่องมือปรากฏ

สาเหตุ: path ใน config ผิด หรือ Python ไม่ได้อยู่ใน PATH

แก้ไข:

# macOS / Linux
which python

Windows

where python

นำ path ที่ได้ไปใส่ใน config แบบเต็ม เช่น /usr/local/bin/python3 แทน python

2. Error: connection to server failed (psycopg2.OperationalError)

อาการ: Claude เรียก query_database แล้วขึ้น error เกี่ยวกับการเชื่อมต่อ

สาเหตุ: รหัสผ่านหรือ host ผิด

แก้ไข: ตรวจสอบว่า env variable ส่งถูก และลองเชื่อมต่อด้วย psql ก่อน:

psql -h localhost -U postgres -d postgres

3. Error: "Tool execution blocked by safety filter"

อาการ: Claude ปฏิเสธเรียก SQL บางคำสั่ง

สาเหตุ: Prompt ที่ส่งให้ Claude อาจมีคำทำให้ LLM เข้าใจผิดว่าเป็น DROP หรือ DELETE

แก้ไข: ใส่ guard ในโค้ดให้อนุญาตเฉพาะ SELECT เท่านั้น (ทำไปแล้วในตัวอย่างด้านบน) และเพิ่ม system prompt บอก Claude ว่า "ใช้แค่ SELECT เท่านั้น"

4. Error: timeout เมื่อ query ตารางใหญ่

อาการ: query ใช้เวลานานกว่า 30 วินาที

แก้ไข: เพิ่ม LIMIT และ timeout:

@mcp.tool()
def query_database(sql: str, limit: int = 100) -> list:
    """รัน SQL แบบ SELECT พร้อมจำกัดจำนวนแถว"""
    if not sql.strip().lower().startswith("select"):
        return [{"error": "อนุญาตเฉพาะ SELECT เท่านั้น"}]
    conn = psycopg2.connect(**DB_CONFIG, connect_timeout=10)
    cur = conn.cursor()
    cur.execute(f"SELECT * FROM ({sql}) AS sub LIMIT {limit}")
    cols = [d[0] for d in cur.description]
    rows = [dict(zip(cols, row)) for row in cur.fetchall()]
    cur.close()
    conn.close()
    return rows

สรุป

การสร้าง Postgres MCP Server ด้วย FastMCP ทำได้ง่ายมาก ใช้เวลาไม่ถึง 15 นาทีก็เสร็จ ข้อสำคัญคือต้องตั้งค่า env variable ให้ถูกต้อง และใส่ guard ป้องกัน SQL injection หากต้องการทดลองใช้โมเดล AI หลาย ๆ ตัวในราคาประหยัด HolySheep AI เป็นตัวเลือกที่น่าสนใจมาก เพราะมีอัตราแลกเปลี่ยนที่ดี หน่วงต่ำกว่า 50ms รองรับ WeChat/Alipay และมีเครดิตฟรีให้ลอง

👉 สมัคร HolySheep AI — รับเครดิตฟรีเมื่อลงทะเบียน