สร้าง MCP Server เครื่องแรกด้วย Python ฉบับ Stateless

Model Context Protocol มีการเปลี่ยนแปลงสำคัญด้วย ข้อกำหนด MCP 2026-07-28 ที่ปรับปรุงให้ตัวโปรโตคอลหลักทำงานแบบ stateless โดยฝั่ง client ไม่จำเป็นต้องสร้าง protocol session ก่อนส่งคำขอ และ server ไม่ต้องพึ่งพา Mcp-Session-Id อีกต่อไป ส่งผลให้การขยายขนาด (scale) บนโครงสร้างพื้นฐาน HTTP ปกติทำได้ง่ายขึ้นมาก
ในขณะเดียวกัน Python SDK ได้อัปเดตเป็น v2 ซึ่งเป็นเวอร์ชันเสถียร โดยมาพร้อม MCPServer API ระดับสูงที่ช่วยให้การกำหนด tools, resources และ prompts ทำได้ผ่านฟังก์ชัน Python ทั่วไป
บทความนี้จะพาคุณสร้าง MCP server ขนาดเล็กสำหรับเก็บฐานข้อมูลความรู้ (knowledge-base) โดยใช้ Python รันผ่าน Streamable HTTP และทดสอบการเชื่อมต่อด้วย Python MCP client
เรากำลังสร้างอะไร?
เราจะสร้าง server ที่เปิดใช้งาน MCP primitive 3 ตัว ได้แก่:
Tool:
search_kb(query, limit)
Resource:
kb://articles
Prompt:
draft_support_reply(customer_message)ตัว server จะไม่มีการเก็บสถานะ session ของผู้ใช้ ทุกคำขอจะมีข้อมูลครบถ้วนในตัวเองตามโมเดล stateless MCP แบบใหม่
ขั้นตอนที่ 1: การสร้างโปรเจกต์
Python SDK ต้องการ Python 3.10 ขึ้นไป แนะนำให้ติดตั้งผ่าน uv เพื่อความรวดเร็ว:
mkdir first-mcp-server
cd first-mcp-server
uv init
uv add "mcp[cli]"หรือใช้ pip ปกติ:
pip install "mcp[cli]"ขั้นตอนที่ 2: สร้าง MCP Server เครื่องแรกของคุณ
เริ่มสร้างไฟล์ server.py โดยใช้คลาส MCPServer ซึ่งเป็น API ระดับสูงสำหรับการจัดการคำสั่งพื้นฐานส่วนใหญ่ แต่ถ้าต้องการควบคุม schemas หรือ protocol metadata อย่างละเอียด SDK ก็ยังมีคลาส Server ระดับล่างให้เลือกใช้
from mcp.server import MCPServer
mcp = MCPServer(
"Developer Support KB",
instructions=(
"Use the knowledge-base tools to answer support questions. "
"Prefer retrieved KB information over guessing."
),
)
ARTICLES = [
{
"id": "python-env",
"title": "Creating a Python virtual environment",
"body": "Create a virtual environment with `python -m venv .venv`..."
},
# เพิ่มข้อมูลอื่นๆ ตามต้องการ
]ขั้นตอนที่ 3: การเพิ่ม MCP Tool
MCP tool คือฟังก์ชันที่โมเดล AI สามารถเลือกเรียกใช้ได้ โดย SDK จะดึงคำจำกัดความมาจาก Python type hints และ docstrings เพื่อสร้าง JSON Schema ให้โดยอัตโนมัติ
@mcp.tool()
def search_kb(query: str, limit: int = 3) -> list[dict[str, str]]:
"""Search the support knowledge base."""
query = query.lower()
matches = [a for a in ARTICLES if query in (a["title"] + a["body"]).lower()]
return matches[:limit]ขั้นตอนที่ 4: การเพิ่ม Resource
Resources เปรียบเสมือนข้อมูลที่อ่านได้อย่างเดียว (คล้าย GET ใน HTTP) ซึ่ง host application สามารถโหลดเข้าสู่บริบทของโมเดลได้โดยตรง
@mcp.resource("kb://articles")
def list_articles() -> str:
"""Return the available knowledge-base articles."""
return "\n".join(f"{a['id']}: {a['title']}" for a in ARTICLES)ขั้นตอนที่ 5: การเพิ่ม MCP Prompt
เราสามารถสร้างเทมเพลต prompt ที่นำกลับมาใช้ใหม่ได้ผ่าน decorator @mcp.prompt() ซึ่งมักจะถูกเรียกใช้โดยผู้ใช้หรือ host เพื่อเริ่มต้นการสนทนา
@mcp.prompt()
def draft_support_reply(customer_message: str) -> str:
"""Create a prompt for drafting a concise support response."""
return f"You are a technical support assistant...\n\n{customer_message}".strip()
if __name__ == "__main__":
mcp.run("streamable-http")ขั้นตอนที่ 6: การรันในโหมด Development
ใช้คำสั่ง MCP Inspector เพื่อทดสอบ server ผ่านอินเทอร์เฟซ UI ในระหว่างการพัฒนา:
uv run mcp dev server.pyขั้นตอนที่ 7: การรันผ่าน Streamable HTTP
สำหรับการใช้งานจริง คุณสามารถรัน server ได้โดยตรง หรือเชื่อมต่อกับ ASGI framework อย่าง FastAPI ผ่าน mcp.streamable_http_app() และรันด้วย Uvicorn เพื่อรองรับการทำงานแบบโปรดักชัน
สถาปัตยกรรม Stateless MCP สำคัญอย่างไร?
ในเวอร์ชันเก่า (Stateful) server ต้องคอยจำ session ของผู้ใช้ ทำให้การทำ load balancing ยุ่งยาก แต่ในข้อกำหนด 2026-07-28 ทุกคำขอจะจบในตัวเอง ทำให้เราสามารถกระจายงานไปยัง worker หลายตัวได้อย่างอิสระโดยไม่ต้องทำ sticky routing
หากแอปพลิเคชันจำเป็นต้องมีสถานะ (เช่น ตะกร้าสินค้า) ผู้พัฒนาควรใช้การส่งไอดี (identifiers) เช่น basket_id ไปกับคำขออย่างชัดเจน แทนที่จะพึ่งพา protocol session แบบเดิม
บทสรุป
การเปลี่ยนผ่านสู่ stateless spec ช่วยให้ MCP server ทำงานเบื้องหลังได้ลื่นไหลขึ้น โดยไม่ต้องวุ่นวายกับการทำ handshake หรือรักษา session คุณเพียงแค่โฟกัสกับการเขียนฟังก์ชันด้วย Python และปล่อยให้ MCPServer จัดการส่วนที่เหลือให้เอง
ความคิดเห็น (0)
เข้าสู่ระบบเพื่อร่วมแสดงความเห็น
สมัครสมาชิกมาเป็นคนแรกที่แสดงความเห็นกันเลยโบร
