อัปเดตแนวทางสำหรับ FastMCP 4 และการตั้งค่า MCP แบบ portable ของ VS Code / GitHub Copilot

#1. MCP คืออะไร

Model Context Protocol (MCP) เป็นมาตรฐานที่ทำให้ AI Agent เชื่อมต่อกับเครื่องมือ (Tools), แหล่งข้อมูล (Resources) และ Prompt ที่ระบบภายนอกจัดเตรียมไว้ได้อย่างเป็นรูปแบบเดียวกัน

ใน Workshop นี้ เราจะสร้าง MCP Server ด้วย FastMCP + Python แล้วให้ GitHub Copilot Agent ใน VS Code เรียกใช้ Tool จาก Server ดังกล่าว

โครงสร้างการทำงาน:

Developer
   |
   v
VS Code + GitHub Copilot Agent
   |
   | MCP
   v
FastMCP Server
   |
   +-- add()
   +-- calculate_bmi()
   +-- get_course_info()

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

  • Python 3
  • VS Code รุ่นปัจจุบัน
  • GitHub Copilot ที่ใช้งาน Copilot Chat / Agent ได้
  • Workspace ที่เชื่อถือได้ (Workspace Trust)
  • FastMCP

ตรวจสอบ Python:

python --version

หรือบนบางระบบ:

python3 --version

#3. สร้าง Project

mkdir fastmcp-copilot-demo
cd fastmcp-copilot-demo

python -m venv .venv

เปิดใช้งาน Virtual Environment

#Windows PowerShell

.venv\Scripts\Activate.ps1

#macOS / Linux

source .venv/bin/activate

ติดตั้ง FastMCP:

pip install -U fastmcp

#4. สร้าง FastMCP Server

สร้างไฟล์ server.py

from fastmcp import FastMCP

mcp = FastMCP("SE Workshop MCP")


@mcp.tool
def add(a: float, b: float) -> float:
    """Add two numbers."""
    return a + b


@mcp.tool
def calculate_bmi(weight_kg: float, height_m: float) -> dict:
    """Calculate BMI from weight in kilograms and height in meters."""
    if height_m <= 0:
        raise ValueError("height_m must be greater than zero")

    bmi = weight_kg / (height_m ** 2)

    if bmi < 18.5:
        category = "Underweight"
    elif bmi < 25:
        category = "Normal"
    elif bmi < 30:
        category = "Overweight"
    else:
        category = "Obesity"

    return {
        "bmi": round(bmi, 2),
        "category": category,
    }


@mcp.tool
def get_course_info(course_code: str) -> dict:
    """Return sample course information by course code."""
    courses = {
        "SE101": {
            "name": "Introduction to Software Engineering",
            "credits": 3,
        },
        "SE201": {
            "name": "Software Testing",
            "credits": 3,
        },
        "SE301": {
            "name": "DevOps Engineering",
            "credits": 3,
        },
    }

    return courses.get(
        course_code.upper(),
        {"error": "Course not found"},
    )


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

@mcp.tool ทำให้ Python function ถูกประกาศเป็น MCP Tool โดย FastMCP จะสร้าง metadata และ input schema ที่ MCP client ใช้ค้นหาและเรียก Tool

#5. ทดลองรัน Server

python server.py

เมื่อใช้ mcp.run() โดยทั่วไป Server แบบ local จะทำงานผ่าน stdio ซึ่งเหมาะกับการให้ VS Code เป็นผู้เริ่ม process และสื่อสารผ่าน MCP โดยตรง

อย่าใช้ print() เพื่อ log แบบสุ่มลง stdout ของ stdio server เพราะ stdout เป็นช่องทางของ protocol; หากต้อง debug ควรใช้ logging ที่เหมาะสมหรือ stderr

#6. ตั้งค่า MCP สำหรับ VS Code / GitHub Copilot

แนวทางปัจจุบันของ VS Code แนะนำ portable workspace configuration ที่ไฟล์:

.mcp.json

สร้างไฟล์ .mcp.json ที่ root ของ project:

{
  "mcpServers": {
    "fastmcp-workshop": {
      "type": "stdio",
      "command": "${workspaceFolder}/.venv/bin/python",
      "args": [
        "${workspaceFolder}/server.py"
      ]
    }
  }
}

#Windows

Path ของ Python ใน virtual environment ต่างออกไป จึงสามารถใช้:

{
  "mcpServers": {
    "fastmcp-workshop": {
      "type": "stdio",
      "command": "${workspaceFolder}\\.venv\\Scripts\\python.exe",
      "args": [
        "${workspaceFolder}\\server.py"
      ]
    }
  }
}

อีกทางหนึ่ง VS Code ยังรองรับ .vscode/mcp.json ซึ่งใช้ top-level key ชื่อ servers:

{
  "servers": {
    "fastmcp-workshop": {
      "type": "stdio",
      "command": "${workspaceFolder}/.venv/bin/python",
      "args": [
        "${workspaceFolder}/server.py"
      ]
    }
  }
}

สำหรับ project ใหม่ ควรพิจารณา .mcp.json เพราะเป็น portable format และใช้ร่วมกับ Copilot tooling ได้กว้างกว่า

#7. Start MCP Server ใน VS Code

เปิด Command Palette:

Ctrl + Shift + P

ค้นหา:

MCP: List Servers

เลือก:

fastmcp-workshop

จากนั้น Start server

หากแก้ไขรายการ Tool แล้ว VS Code ยังแสดง Tool เก่า ให้ใช้:

MCP: Reset Cached Tools

และ Restart server

#8. เรียก Tool ผ่าน GitHub Copilot

เปิด GitHub Copilot Chat และเลือก Agent mode

ตรวจสอบ Tool picker ว่าเห็น Tools เช่น:

add
calculate_bmi
get_course_info

จากนั้นทดลอง Prompt:

ใช้ MCP tool คำนวณ 125 + 875

Copilot สามารถเลือก add และส่ง argument:

{
  "a": 125,
  "b": 875
}

ผลลัพธ์:

1000

ทดลอง BMI:

ใช้ MCP tool คำนวณ BMI สำหรับน้ำหนัก 70 kg และส่วนสูง 1.75 m

หรือ:

เรียก get_course_info เพื่อดูข้อมูลวิชา SE201

Agent จะพิจารณา Tool schema และเลือก Tool ที่สัมพันธ์กับคำสั่ง ผู้ใช้อาจต้องอนุมัติการเรียก Tool ตามการตั้งค่าความปลอดภัย

#9. เพิ่ม Tool สำหรับข้อมูล Software Engineering

@mcp.tool
def recommend_test_type(requirement: str) -> dict:
    """Recommend a software testing type from a requirement."""
    text = requirement.lower()

    if "performance" in text or "load" in text:
        test_type = "Performance Testing"
    elif "api" in text:
        test_type = "API Testing"
    elif "security" in text:
        test_type = "Security Testing"
    elif "ui" in text or "browser" in text:
        test_type = "UI / End-to-End Testing"
    else:
        test_type = "Functional Testing"

    return {
        "requirement": requirement,
        "recommended_test": test_type,
    }

Restart MCP Server แล้ว Prompt:

ใช้ MCP วิเคราะห์ว่า requirement
"ระบบต้องรองรับผู้ใช้พร้อมกัน 10,000 คน"
ควรทดสอบแบบใด

#10. การทำงานภายใน

sequenceDiagram
    participant U as Developer
    participant C as GitHub Copilot Agent
    participant M as FastMCP Server
    participant T as Python Tool

    U->>C: ขอให้คำนวณ BMI
    C->>M: tools/list
    M-->>C: calculate_bmi schema
    C->>M: tools/call
    M->>T: calculate_bmi(70, 1.75)
    T-->>M: BMI result
    M-->>C: MCP result
    C-->>U: สรุปผล

ประเด็นสำคัญคือ LLM ไม่จำเป็นต้องรู้ implementation ภายใน Tool แต่ใช้ชื่อ คำอธิบาย และ schema ของ Tool เพื่อวางแผนเรียกใช้งาน

#11. โครงสร้าง Project ที่แนะนำ

fastmcp-copilot-demo/
├── .mcp.json
├── .venv/
├── server.py
├── requirements.txt
└── README.md

สร้าง requirements.txt:

fastmcp

#12. Troubleshooting

#MCP Server ไม่ขึ้น

ตรวจสอบ interpreter:

.venv/bin/python --version

Windows:

.venv\Scripts\python.exe --version

และทดลองรัน:

python server.py

#Copilot ไม่เห็น Tool

ใช้ Command Palette:

MCP: List Servers
MCP: Reset Cached Tools

จากนั้น Restart server และเปิด Agent mode ใหม่

#Workspace ถูก block

Workspace MCP configuration ต้องอาศัย Workspace Trust หาก folder อยู่ใน Restricted Mode server อาจไม่เริ่มทำงาน

#JSON configuration ผิด format

จำความแตกต่าง:

.mcp.json          -> mcpServers
.vscode/mcp.json   -> servers

#Server start แล้วหยุดทันที

ให้ใช้ Python executable จาก virtual environment โดยตรง และตรวจสอบว่า fastmcp ถูกติดตั้งอยู่ใน environment เดียวกัน

#13. Security

MCP Server แบบ local สามารถรันโค้ดและเข้าถึงทรัพยากรบนเครื่องตามสิทธิ์ของ process ได้ ดังนั้น:

  • ใช้ MCP Server จากแหล่งที่เชื่อถือได้
  • ตรวจสอบ command และ args ก่อน Start
  • ไม่ hardcode API key ลง repository
  • จำกัดสิทธิ์ Tool เท่าที่จำเป็น
  • แยก read-only Tool ออกจาก Tool ที่แก้ไขข้อมูล
  • ตรวจสอบ argument ก่อนนำไปใช้กับ shell, SQL หรือ filesystem
  • ใช้ environment variables / secret management สำหรับ credentials

#14. สรุป

FastMCP ช่วยลด boilerplate ในการสร้าง MCP Server ด้วย Python โดย developer สามารถเปลี่ยน function ให้เป็น AI-callable tool ผ่าน decorator ได้อย่างตรงไปตรงมา

Workflow หลักคือ:

Python Function
      ↓
@mcp.tool
      ↓
FastMCP Server
      ↓ MCP / stdio
VS Code
      ↓
GitHub Copilot Agent
      ↓
เลือกและเรียก Tool
      ↓
ผลลัพธ์กลับสู่ Agent

แนวทางนี้เหมาะสำหรับสร้าง Developer Tools, Database Tools, API Tools, Testing Tools, DevOps Automation, RAG retrieval tools และ internal enterprise tools ที่ต้องการให้ AI Agent เรียกใช้แบบมี schema และขอบเขตชัดเจน

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