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ớistreamable-httpthì 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ưngsamplingkhông còn hoạt động nữa — mà không rõ vì sao. - Tool
researchcủ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:
stdiovà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_httpvà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ừ
stdiosanghttpmà 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/awaittrong 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:
- 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). - Bài 10.4 — Streamable HTTP in depth (để debug SSE connection issues).
- Bài 10.6 + 10.8 — thêm progress/log notifications vào tool chạy lâu (user experience up liền).
- 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:
- Mở terminal,
cdvào một thư mục rỗng — gọi làmcp-advanced/. Đây là "sân tập" cho tất cả walkthrough.
- 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.
- 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ài | Vì sao đọc |
|---|---|
| 10.2 JSON message types | Foundation — không hiểu message structure thì các bài sau vô nghĩa |
| 10.5 StreamableHTTP chuyên sâu | Hiể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 Sampling | Tí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ợ
- Spec chính thức: modelcontextprotocol.io
- SDK Python: github.com/modelcontextprotocol/python-sdk
- Anthropic API docs: docs.claude.com
- Báo lỗi / góp ý: trong issue của repo bạn đang dùng để theo khóa