← MockServer Professional Day 5 • Module 5

Day 5 / Module 5: AI-Native Protocol, Built-in MCP Server, LLM Streaming Mocking & Cost Optimization

คู่มือพิมพ์เขียวเชิงลึกและการวิเคราะห์ทางเทคนิค: การประยุกต์ใช้ Model Context Protocol (MCP) ควบคุม MockServer ด้วยภาษาธรรมชาติ, การจำลอง Token-by-token Streaming ผ่าน SSE และการตัดต้นทุน API สู่ 0 บาท

[1] ส่วนที่ 1: หมุดเชื่อมโยง & Roadmap Progress Tracker

Day Tracker: 5/6

ชื่อบท/หัวข้อหลัก: Module 5: AI-Native Protocol, Built-in MCP Server, LLM Streaming Mocking & Cost Optimization

❓ หมุดตั้งโจทย์: "ทำไมบทนี้ถึงชื่อนี้? และเรากำลังเรียนเรื่องนี้ไปเพื่ออะไร?"

ตอบ: การพัฒนาแอปพลิเคชันยุคใหม่จำเป็นต้องพึ่งพา LLM APIs (เช่น OpenAI, Anthropic, Gemini) ซึ่งมีต้นทุนค่า API สูงมากต่อการทดสอบ มีความล่าช้าจากเครือข่ายและตัวโมเดล และอาจผันผวนจนทำให้โค้ดพังได้ง่าย ยิ่งไปกว่านั้น ในยุค AI Agent การเปิดให้ AI สามารถสร้างและจัดการ Mocks ได้เองโดยอัตโนมัติกลายเป็นสิ่งสำคัญ บทนี้จึงตั้งชื่อว่า AI-Native Protocol, Built-in MCP Server, LLM Streaming Mocking & Cost Optimization เพื่อเรียนรู้วิธีใช้ Model Context Protocol (MCP) สั่งงาน MockServer ผ่าน AI Assistant, การทำ Mocks สำหรับ SSE (Server-Sent Events) LLM Streaming และการจำลองระบบ LLM API เพื่อลดต้นทุนและเพิ่มความเร็วในการทดสอบ 100x

PROGRESS ROADMAP:
✓ Day 1: Mod 1
✓ Day 2: Mod 2
✓ Day 3: Mod 3
✓ Day 4: Mod 4
▶ Day 5: Mod 5
Day 6: Mod 6

[2] ส่วนที่ 2: เรื่องราวและมโนทัศน์เชิงลึก (Narrative, Case Study & Mental Models)

1. ฉากสถานการณ์จริง (The Narrative/Case Study)

บริษัทสตาร์ทอัป AI Assistant เจอบิลค่า API เดือนละล้าน และโค้ดพังเพราะ Stream หลุด

บริษัทแห่งหนึ่งกำลังพัฒนา AI Copilot สำหรับแอปพลิเคชันองค์กร โดยเชื่อมต่อกับ OpenAI GPT-4o และ Claude 3.5 Sonnet ผ่านระบบ Streaming (SSE) ในระหว่างการพัฒนาและรัน Automated Test Suite ทีมวิศวกรต้องยิงเรียก LLM API จริงทุกครั้ง ส่งผลให้:

  • ค่าใช้จ่าย OpenAI API พุ่งสูงเกิน $30,000 ต่อเดือนจากการรัน Integration Tests ซ้ำๆ
  • การรัน Test Suite แต่ละรอบใช้เวลานานเกิน 45 นาที เพราะต้องรอโมเดลเจนข้อความแบบ Real-time
  • เมื่อเกิดสภาวะ Rate Limit (HTTP 429) หรือ Stream หลุดกลางคัน แอปพลิเคชันฝั่ง Frontend เกิดการแสดงผลค้าง แต่ไม่สามารถจำลอง Bug นี้ซ้ำบน Local เพื่อแก้ไขได้ง่ายๆ

💡 การนำ Built-in MCP Server & LLM Streaming Mocking เข้ามาแก้ปัญหา: ทีมงานเปลี่ยนมาใช้ MockServer ซึ่งมี Built-in MCP Server (/mockserver/mcp):

  • นักพัฒนาเปิดใช้งาน MCP ร่วมกับ Cursor / Claude Code ทำให้สามารถใช้ภาษาธรรมชาติพิมพ์สั่ง AI ให้สร้าง Expectation สำหรับจำลอง LLM API ได้ทันที
  • สั่ง MockServer ให้จำลอง Server-Sent Events (SSE) Streaming (text/event-stream) คืนค่าโทเค็นแบบทีละชิ้น และสุ่มจำลองเหตุการณ์สายหลุดกลางคัน (dropConnection)
  • ผลลัพธ์: ค่าใช้จ่าย API ลดลงเหลือ $0 ในการทดสอบ, เวลาในการรัน Integration Test ลดลงจาก 45 นาทีเหลือเพียง 12 วินาที และสามารถดักจับการจัดการ Stream หลุดได้อย่างสมบูรณ์แบบ
2. ถอดรหัสศัพท์เทคนิคและอุปมาอุปไมย (Explicit Terms & Mental Models)
01. Model Context Protocol (MCP)
ล่ามแปลภาษามาตรฐานระหว่าง AI กับเครื่องมือ

แปลตรงตัว: โปรโตคอลบริบทสำหรับโมเดล AI

อุปมาอุปไมย: เหมือน "สายแปลงปลั๊กไฟสากล" ที่ทำให้ AI Assistant (เช่น Cursor, Claude Desktop) สามารถเสียบต่อเข้ากับ MockServer แล้วส่งคำสั่งควบคุม (สร้าง Mocks, ตรวจสอบ Logs) ได้โดยตรงโดยไม่ต้องให้มนุษย์มานั่งพิมพ์คำสั่ง cURL เอง

02. Server-Sent Events (SSE) Streaming
การลำเลียงสินค้าบนสายพานทีละกล่อง

แปลตรงตัว: การส่งเหตุการณ์จากเซิร์ฟเวอร์หาคลายเอนต์แบบต่อเนื่อง

อุปมาอุปไมย: เหมือน "สายพานลำเลียงกล่องข้อความ" แทนที่จะรอให้เขียนหนังสือเสร็จทั้งเล่มค่อยส่งไปทีเดียว เซิร์ฟเวอร์จะทยอยส่งตัวอักษรทีละคำผ่านสายพานแบบต่อเนื่องจนกว่าจะส่งคำว่า data: [DONE]

03. LLM Cost Optimization & Deterministic Testing
ตู้กดน้ำจำลองราคาศูนย์บาท

แปลตรงตัว: การลดต้นทุนและการทดสอบที่แม่นยำสำหรับ LLM

อุปมาอุปไมย: เหมือน "ตู้หยอดเหรียญซ้อมชงกาแฟ" แทนที่จะเสียเงินจริงซื้อเมล็ดกาแฟพรีเมียมทุกครั้งที่ซ้อมชง เราใช้ตู้จำลองที่ตอบกลับรูปและรสชาติเดิมเป๊ะๆ โดยไม่ต้องเสียเงินสักบาทเดียว

04. Advanced AI Protocols (MCP, A2A, SSE)
ชุดภาษาการสื่อสารสมัยใหม่ของเอเจนต์

แปลตรงตัว: โปรโตคอลสำหรับการสื่อสารของระบบ AI

อุปมาอุปไมย: เหมือน "วิทยุสื่อสารหลายคลื่นความถี่" เช่น MCP (การคุยระหว่าง Tool กับ AI), A2A (Agent-to-Agent คุยระหว่าง AI ด้วยกันเอง), และ SSE/WebSocket (ท่อส่งข้อมูลเรียลไทม์) ซึ่ง MockServer รองรับการจำลองทั้งหมดในตัว

⚠️ Root Cause (รากของปัญหา)

การผูกการทดสอบซอฟต์แวร์เข้ากับ Live LLM APIs ตรงๆ ทำให้เกิดปัญหาน้ำซึมบ่อทรายทั้งเรื่องค่าใช้จ่าย (High Token Cost) และความล่าช้า (High Latency)

📉 Business Impact (ผลกระทบทางธุรกิจ)

งบประมาณไอทีรั่วไหล, วงจรการพัฒนาช้าลงอย่างมาก (Slow Developer Velocity) และเสี่ยงต่อการที่ AI ตอบคำถามไม่เหมือนเดิมในการทดสอบแต่ละรอบ (Non-deterministic Flaky Tests)

[3] ส่วนที่ 3: การถอดรหัสและอธิบายโค้ดอย่างละเอียด (Line-by-line Breakdown)

1. การตั้งค่า SSE LLM Streaming Mocking (text/event-stream)
{
  "httpRequest": {
    "method": "POST",
    "path": "/v1/chat/completions"
  },
  "httpResponse": {
    "statusCode": 200,
    "headers": {
      "Content-Type": ["text/event-stream"],       # [Line 7] ระบุ Content-Type เป็น text/event-stream สำหรับ SSE
      "Cache-Control": ["no-cache"]                # [Line 8] ป้องกันการแคชข้อมูล Stream
    },
    "body": "data: {\"choices\": [{\"delta\": {\"content\": \"Hello\"}}]}\n\ndata: {\"choices\": [{\"delta\": {\"content\": \" World\"}}]}\n\ndata: [DONE]\n\n"
    # [Line 10] ส่งข้อมูลตามฟอร์แมต OpenAI SSE: ขึ้นต้นด้วย "data: " คั่นด้วย \n\n และปิดท้ายด้วย "data: [DONE]\n\n"
  }
}
2. การสั่งการผ่าน Built-in MCP Server (POST /mockserver/mcp)
{
  "jsonrpc": "2.0",                                 # [Line 2] ใช้มาตรฐาน JSON-RPC 2.0 ตามข้อกำหนด MCP
  "method": "mcp/list_tools",                      # [Line 3] คำสั่งขอรายการ Tools ที่ MockServer MCP มีให้ AI เรียกใช้
  "id": 1
}
3. การจำลอง OpenAI Rate Limit Error (HTTP 429)
{
  "httpRequest": {
    "method": "POST",
    "path": "/v1/chat/completions/unstable"
  },
  "httpResponse": {
    "statusCode": 429,                              # [Line 7] ส่ง HTTP Status 429 Too Many Requests
    "headers": {
      "Content-Type": ["application/json"],
      "Retry-After": ["20"]                         # [Line 10] ส่ง Header แจ้งให้รอ 20 วินาที
    },
    "body": "{\"error\": {\"message\": \"Rate limit reached\", \"type\": \"requests\", \"code\": \"rate_limit_exceeded\"}}"
    # [Line 12] คืนค่า JSON Error Structure แบบเดียวกับ OpenAI API
  }
}

[4] ส่วนที่ 4: คู่มือการใช้งานผ่าน Web UI / Dashboard

เปิดเว็บเบราว์เซอร์ไปที่: http://localhost:1080/mockserver/dashboard

========================================================================================
                          MOCKSERVER WEB DASHBOARD (PORT 1080)
========================================================================================
 [ Active Expectations ] | [ Recorded Requests / Logs ] | [ Breakpoints ] | [ Reset All ]
----------------------------------------------------------------------------------------
LLM SSE Streaming Tab:      - ตรวจสอบประวัติ Request ในแท็บ Logs ว่า Content-Type เป็น text/event-stream หรือไม่
                            - ตรวจดูว่า Chunk Data ถูกส่งออกไปตามลำดับถูกต้องครบถ้วน

MCP Interaction Monitor:    - สังเกตการสั่งการผ่าน /mockserver/mcp เมื่อ AI Assistant (Cursor/Claude) สร้าง Mocks
                            - รายการ Active Expectations จะอัปเดตแบบ Real-time ทันที

Stream Breakpoints:         - ใช้ปุ่ม Disable หรือ Breakpoints บน Dashboard เพื่อทดสอบการตัด Stream กลางคัน

[5] ส่วนที่ 5: โครงสร้างไฟล์โปรเจกต์มาตรฐาน (Enterprise File Structure Best Practice)

mockserver-module5-enterprise/
├── docker-compose.yml
├── config/
│   └── mockserver.properties
├── mcp.json                                # ไฟล์ตั้งค่า MCP Server เชื่อมกับ Cursor/Claude
├── expectations/
│   ├── ai-services/
│   │   ├── openai-sse-stream.json          # Mock SSE Streaming
│   │   ├── openai-non-stream.json          # Mock Chat Completion ปกติ
│   │   └── openai-rate-limit-429.json      # Mock Rate Limit Error
│   └── claude/
│       └── anthropic-messages.json         # Mock Anthropic Messages API
├── scripts/
│   └── seed_ai_mocks.sh
└── tests/
    └── LLMIntegrationTest.py               # Pytest ทดสอบการเชื่อมต่อ LLM

[6] ส่วนที่ 6: แบบฝึกหัดภาคปฏิบัติแน่นๆ (Hands-on Refactoring & 6 Drills)

❌ Flawed Approach (ยิงหา OpenAI API จริงในการรัน Tests)

รันแต่ละรอบเสียเงิน $0.05 และใช้เวลา 10 วินาที แถมเสี่ยงโดน Rate Limit 429:

client = OpenAI(api_key="sk-real-key")
response = client.chat.completions.create(model="gpt-4o", messages=[...])
✅ Refactored Approach (ยิงหา MockServer LLM Endpoint)

รันผ่าน MockServer ฟรี 100%, ได้ผลลัพธ์ใน 2ms และจำลอง SSE Stream ได้เหมือนจริง:

client = OpenAI(base_url="http://localhost:1080/v1", api_key="sk-mock-key")
response = client.chat.completions.create(model="gpt-4o", messages=[...])
ชุดแบบฝึกหัดปฏิบัติการ 6 ข้อ (Hands-on Drill Pack)

ก่อนเริ่มทำ ตรวจสอบว่าเปิด MockServer ไว้ที่ http://localhost:1080 เรียบร้อยแล้ว

Drill 5.1: Inspecting Built-in MCP Server (/mockserver/mcp)

Test/Action:

curl -i -X POST http://localhost:1080/mockserver/mcp -H "Content-Type: application/json" -d '{ "jsonrpc": "2.0", "method": "mcp/list_tools", "id": 1 }'

Expected: HTTP 200 OK พร้อมรายการ MCP Tools ที่ AI Assistant สามารถเรียกใช้สั่งการสร้าง/จัดการ Mocks ได้

Drill 5.2: SSE LLM Streaming Mocking (text/event-stream)

Setup:

curl -X PUT "http://localhost:1080/mockserver/expectation" -H "Content-Type: application/json" -d '{"httpRequest": { "method": "POST", "path": "/v1/chat/completions" }, "httpResponse": { "statusCode": 200, "headers": { "Content-Type": ["text/event-stream"], "Cache-Control": ["no-cache"] }, "body": "data: {\"choices\": [{\"delta\": {\"content\": \"Hello\"}}]}\n\ndata: {\"choices\": [{\"delta\": {\"content\": \" World\"}}]}\n\ndata: [DONE]\n\n" }}'

Test: curl -i -N -X POST http://localhost:1080/v1/chat/completions -H "Content-Type: application/json" -d '{"model": "gpt-4o", "messages": [{"role": "user", "content": "Hi"}], "stream": true}' (ข้อความแบบ SSE Stream ไหลออกแสดงผลทีละบรรทัด พร้อมปิดท้ายด้วย data: [DONE])

Drill 5.3: OpenAI-Compatible Non-Streaming Mock

Setup:

curl -X PUT "http://localhost:1080/mockserver/expectation" -H "Content-Type: application/json" -d '{"httpRequest": { "method": "POST", "path": "/v1/chat/completions", "body": { "type": "JSON", "json": "{\"model\": \"gpt-4o\"}", "matchType": "ONLY_MATCHING_FIELDS" } }, "httpResponse": { "statusCode": 200, "headers": { "Content-Type": ["application/json"] }, "body": "{\"id\": \"chatcmpl-999\", \"choices\": [{\"message\": {\"role\": \"assistant\", \"content\": \"Mocked LLM Response\"}}]}" }}'

Test: curl -i -X POST http://localhost:1080/v1/chat/completions -H "Content-Type: application/json" -d '{"model": "gpt-4o", "messages": [{"role": "user", "content": "Test"}]}' (ได้ HTTP 200 OK พร้อม JSON ในรูปแบบมาตรฐาน OpenAI API)

Drill 5.4: LLM Rate Limit Injection (HTTP 429 rate_limit_exceeded)

Setup:

curl -X PUT "http://localhost:1080/mockserver/expectation" -H "Content-Type: application/json" -d '{"httpRequest": { "method": "POST", "path": "/v1/chat/completions/unstable" }, "httpResponse": { "statusCode": 429, "headers": { "Content-Type": ["application/json"], "Retry-After": ["20"] }, "body": "{\"error\": {\"message\": \"Rate limit reached\", \"type\": \"requests\", \"code\": \"rate_limit_exceeded\"}}" }}'

Test: curl -i -X POST http://localhost:1080/v1/chat/completions/unstable (ได้ HTTP 429 Too Many Requests พร้อมรายละเอียด Error แบบเดียวกับ OpenAI)

Drill 5.5: Interrupted Stream Simulation (จำลองสายหลุดระหว่างทำ Streaming)

Setup:

curl -X PUT "http://localhost:1080/mockserver/expectation" -H "Content-Type: application/json" -d '{"httpRequest": { "method": "POST", "path": "/v1/chat/completions/broken-stream" }, "httpError": { "dropConnection": true }}'

Test: curl -i -X POST http://localhost:1080/v1/chat/completions/broken-stream (ได้ curl: (52) Empty reply from server ทันที)

Drill 5.6: Verifying Prompt Payload Sent to LLM Endpoint

Verify Call:

curl -X PUT "http://localhost:1080/mockserver/verify" -H "Content-Type: application/json" -d '{"httpRequest": { "method": "POST", "path": "/v1/chat/completions", "body": { "type": "JSON", "json": "{\"messages\": [{\"role\": \"user\", \"content\": \"Hi\"}]}", "matchType": "ONLY_MATCHING_FIELDS" } }, "times": { "exact": 1 }}'

Expected: HTTP 202 Accepted (พบประวัติการยิง prompt ตรงตามเงื่อนไข)

⚡ Instant Feedback Quiz

ส่วนที่ 7: แบบทดสอบประเมินความรู้ Day 5 / Module 5 (10 ข้อ)

คลิกเลือกคำตอบข้อที่ถูกต้อง ระบบจะตรวจให้คะแนนและแสดงผลเฉลยพร้อมคำอธิบายทันที!

คะแนนสด 0 / 10
[8]

ส่วนที่ 8: สรุปหมุดเชื่อมโยงกลับหาหัวข้อบท (Closing Title Connection Wrap-up)

เนื้อหาและแบบฝึกหัดทั้งหมดในวันนี้ ตอบและสะท้อนชื่อบท Day 5 / Module 5: AI-Native Protocol, Built-in MCP Server, LLM Streaming Mocking & Cost Optimization อย่างสมบูรณ์: การนำ Built-in MCP Server (/mockserver/mcp) มาเชื่อมต่อกับ AI Assistant ช่วยยกระดับการสร้าง Mocks สู่ยุค AI-Native, การจำลอง SSE LLM Streaming และการทำ LLM Cost Optimization ช่วยตัดค่าใช้จ่าย API สู่ศูนย์บาท และเพิ่มความเร็วในการรัน Integration Tests ได้นับร้อยเท่าอย่างมีประสิทธิภาพครับ!