Lộ trình học›MCP›MCP: Advanced Topics Mở bản đồ

10.0 · Tổng quan khóa học MCP nâng cao

Bài viếtNâng cao10 phút đọc

Hãy thành thật một chút. Nếu bạn đã build qua vài MCP server cơ bản, có lẽ bạn đã gặp những tình huống sau đây:

Tại sao bạn cần khóa học này?

  • Server chạy ngon trên local với stdio, nhưng vừa deploy lên Cloud Run với streamable-http thì progress bar biến mất, log im lặng, tool call báo 404 sau vài phút.
  • Bạn bật stateless_http=True để scale horizontal, và tự dưng sampling không còn hoạt động nữa — mà không rõ vì sao.
  • Tool research của bạn chạy 2-3 phút, user không biết nó đang làm gì, tưởng server treo, tắt Claude Desktop giữa chừng.
  • Bạn muốn MCP server gọi Claude để tóm tắt, nhưng không muốn tự quản API key cho 10,000 user công khai.
  • Bạn có 1 tool convert video, user nói "convert biking.mp4" và tool của bạn chịu chết vì không biết file ở đâu.

Nếu bạn đã gặp ít nhất 2/5 tình huống trên, đây đúng là khóa học bạn cần.

Đây không phải khóa học MCP nhập môn. Nếu bạn chưa biết tool/resource/prompt là gì trong MCP, hãy quay lại khóa "Introduction to Model Context Protocol" trước. Ở đây chúng ta đi sâu vào 3 tính năng nâng cao mà 80% MCP server ngoài kia chưa dùng: sampling, roots, notifications, cộng với toàn bộ transport layer — nơi mà phần lớn production bug của MCP đang ẩn náu.

Khóa này sẽ đi qua 4 chủ đề lớn

┌──────────────────────────────────────────────────────────┐
│                                                          │
│   CHỦ ĐỀ 1: MESSAGE & TRANSPORT LAYER                    │
│   ├── 10.2  JSON message types (foundation)              │
│   ├── 10.3  Transport STDIO                              │
│   ├── 10.4  Transport Streamable HTTP                    │
│   ├── 10.5  Streamable HTTP chuyên sâu (SSE workaround)  │
│   └── 10.6  Stateless HTTP & json_response flags         │
│                                                          │
│   CHỦ ĐỀ 2: NOTIFICATIONS (user experience)              │
│   ├── 10.7  Log & Progress notifications                 │
│   └── 10.8  Walkthrough: triển khai notifications        │
│                                                          │
│   CHỦ ĐỀ 3: SAMPLING (server mượn model của client)      │
│   ├── 10.9  Sampling — khái niệm & use case              │
│   └── 10.10 Walkthrough: implement sampling              │
│                                                          │
│   CHỦ ĐỀ 4: ROOTS (file access boundary)                 │
│   ├── 10.11 Roots — permission & context                 │
│   └── 10.12 Walkthrough: implement roots                 │
│                                                          │
│   TỔNG KẾT                                               │
│   ├── 10.13 Quiz 10 câu kiểm tra kiến thức               │
│   └── 10.13 Tổng kết, survey & bước tiếp theo            │
│                                                          │
└──────────────────────────────────────────────────────────┘

Tổng: 14 bài, ~4-6 giờ đọc + thực hành. Mỗi bài concept đi kèm 1 bài walkthrough code để bạn tự chạy thử.

Bạn sẽ học được gì

Về kiến thức protocol

  • Giải thích được cấu trúc của mọi JSON message trong MCP (request/result/notification) và vì sao phân loại như vậy quan trọng.
  • Phân biệt được 2 loại transport: stdio và streamable-http — biết dùng cái nào trong từng hoàn cảnh.
  • Hiểu được vì sao HTTP khó làm bidirectional communication và cách Streamable HTTP workaround bằng SSE.
  • Giải thích được ý nghĩa và trade-off của 2 flag quan trọng: stateless_http và json_response.

Về 3 tính năng advanced

  • Biết khi nào dùng sampling để server xin client gọi model thay (giảm chi phí + security).
  • Biết cách dùng roots để grant & giới hạn file access, tránh để Claude "tự do bay lượn" trong file system.
  • Biết cách gửi logs + progress để user có feedback real-time trong quá trình tool chạy lâu.

Về kỹ năng thực chiến

  • Implement đầy đủ 3 tính năng trên cả server lẫn client với Python SDK.
  • Debug được khi deploy từ stdio sang http mà function biến mất.
  • Chọn đúng transport + flag cho deploy case: local dev, single instance prod, hay horizontal scaling sau load balancer.

Triết lý xuyên suốt khóa

Có 4 nguyên tắc sẽ lặp lại xuyên suốt. Hãy ghi nhớ từ đầu:

1. "Protocol trước, SDK sau"

MCP là open specification — không phải SDK độc quyền của Anthropic. Mọi thứ bạn học trong khóa này là về protocol, không phải về mcp-sdk-python. Khi bạn hiểu protocol, bạn dịch sang TypeScript/Go/Rust SDK đều được.

Spec gốc: github.com/modelcontextprotocol/specification.

2. "Bidirectional là tính năng, không phải optional"

MCP được thiết kế cho cả client → server VÀ server → client. Rất nhiều developer mới nghĩ MCP = "client gọi server tools", và rồi ngạc nhiên khi progress notification / sampling không work trên HTTP. Bạn cần giữ mental model "hai chiều" từ đầu.

3. "Transport quyết định năng lực"

Cùng 1 server code, deploy trên stdio thì full năng lực, deploy trên streamable-http với stateless_http=True thì mất sampling + notifications + subscriptions. Transport không phải detail triển khai — nó quyết định API surface thực tế cho user.

4. "Server yêu cầu, client quyết định"

Sampling, roots, notifications — các tính năng nâng cao đều theo model: server xin, client toàn quyền xử lý. Server không bao giờ ép client phải làm gì. Client có thể ignore log, từ chối sampling, không expose roots. Mental model này giữ cho ecosystem MCP secure và flexible.

Prerequisite — Bạn cần gì trước khi bắt đầu

Bắt buộc

  • Đã hoàn thành khóa nhập môn MCP (hoặc biết MCP tools/resources/prompts là gì).
  • Python 3.10+ và uv (package manager được dùng trong tất cả walkthrough).
  • Anthropic API key (có tier miễn phí) — dùng ở bài sampling.
  • Claude Desktop hoặc một MCP client tương tự để test.

Nên có

  • Đã từng deploy một service HTTP lên cloud (Cloud Run, Railway, Fly.io, Heroku). Không bắt buộc nhưng giúp hiểu bài 10.5 về scaling.
  • Kinh nghiệm với async/await trong Python (vì SDK MCP Python async-first).
  • Đọc qua spec HTTP cơ bản: request/response, headers, status codes.

Không cần

  • Kinh nghiệm implement protocol từ scratch (chúng ta dùng SDK).
  • Kiến thức sâu về WebSocket hay gRPC (SSE đơn giản hơn nhiều).

Hai cách tiếp cận khóa học

Nếu bạn là developer đã có MCP server trong production

Tập trung vào các bài sau theo thứ tự ưu tiên:

  1. Bài 10.5 — hiểu stateless_http & json_response (chắc chắn đây là nguồn bug chính của bạn).
  2. Bài 10.4 — Streamable HTTP in depth (để debug SSE connection issues).
  3. Bài 10.6 + 10.8 — thêm progress/log notifications vào tool chạy lâu (user experience up liền).
  4. Phần còn lại theo nhu cầu.

Nếu bạn là developer mới bắt đầu dự án MCP serious

Đọc theo thứ tự từ 10.2 đến 10.13. Đừng nhảy cóc — mỗi bài build trên bài trước, đặc biệt cụm transport (10.2 → 10.6).

Quy tắc 40/40/20 áp dụng cho khóa này

Vì đây là khóa technical sâu, phân bổ thời gian khuyến nghị:

  • 40% đọc concept — từng bài có video gốc 5-10 phút, bạn đọc bản tinh chế có thể lâu hơn vì sâu hơn.
  • 40% làm walkthrough — mỗi tính năng có walkthrough với code chạy được. Phải tự tay chạy, không skip.
  • 20% build project nhỏ của bạn — áp dụng 1 tính năng advanced vào MCP server thật (không phải demo) ngay khi học xong tính năng đó.

Nếu bạn chỉ đọc lý thuyết mà không code, kiến thức sẽ phai sau 2 tuần.

Ba sai lầm phổ biến khi học MCP advanced

Sai lầm 1: Nhảy vào sampling trước khi hiểu transport

Developer mới thường excited với sampling ("server gọi được Claude!"), skip phần transport, rồi thắc mắc vì sao sampling không work trên HTTP deploy của mình. Thứ tự đúng: transport → notifications → sampling → roots.

Sai lầm 2: Copy-paste stateless_http=True vì thấy trong tutorial

Rất nhiều tutorial bảo "bật stateless_http để scale" mà không nói rõ nó disable những gì. Trong bài 10.5 bạn sẽ học 5 tính năng bị mất khi bật flag này — quyết định sau đó sẽ có căn cứ.

Sai lầm 3: Implement notifications nhưng không test với tool chậm

Bạn add context.report_progress() vào tool 100ms, test local, thấy "hoạt động", rồi deploy. Khi tool production chạy 2 phút với HTTP transport, progress vẫn không hiện. Vì sao? Vì bạn chưa đọc bài 10.5 về flag json_response — một flag tưởng vô hại nhưng disable streaming response của tool call.

Chuẩn bị ngay bây giờ

Hãy dành 5 phút làm những việc sau:

  1. Mở terminal, cd vào một thư mục rỗng — gọi là mcp-advanced/. Đây là "sân tập" cho tất cả walkthrough.
  1. Viết ra 3 câu hỏi bạn đang có về MCP (không cần hoàn hảo). Ví dụ: — "Vì sao server của tôi mất progress khi deploy?" — "Làm sao để server dùng model mà không cần API key riêng?" — "Có an toàn khi cho Claude đọc Documents folder không?"

Sau khóa học, review lại 3 câu này. Nếu trả lời được 3/3 → bạn đã absorbed.

  1. Cài đặt công cụ:
   # Kiểm tra Python >= 3.10
   python3 --version

   # Cài uv nếu chưa có
   curl -LsSf https://astral.sh/uv/install.sh | sh

   # Download code bundles (sẽ có link ở mỗi walkthrough)
   mkdir -p ~/mcp-advanced
   cd ~/mcp-advanced

Bản đồ đọc nhanh

Nếu bạn chỉ có 60 phút và muốn nắm 80% giá trị khóa, đọc đúng 4 bài này:

BàiVì sao đọc
10.2 JSON message typesFoundation — không hiểu message structure thì các bài sau vô nghĩa
10.5 StreamableHTTP chuyên sâuHiểu SSE workaround = hiểu 90% cách production MCP hoạt động
10.6 State & flagsĐây là bug source số 1 của MCP production
10.9 SamplingTính năng khiến MCP khác biệt so với "REST API wrapper" thông thường

Còn lại đọc theo nhu cầu.

Bắt đầu thôi

Hãy chuẩn bị tinh thần đọc một chút "raw protocol" — và rồi mọi thứ sẽ ráp lại trong các bài sau.

Phản hồi và hỗ trợ

Bạn đã hoàn thành bài này chưa?Tiến độ lưu trên trình duyệt của bạn.

Khóa học cùng lộ trình