MCP 2026-07-28: giao thức chuyển sang stateless, cần biết gì?
Tóm tắt
Spec MCP 2026-07-28 bỏ handshake initialize và header Mcp-Session-Id: mỗi request tự mang phiên bản và capability. Server dễ scale hơn, nhưng logic dựa vào session, sampling và SSE resumable cần thiết kế lại.
Nếu bạn từng triển khai MCP server từ xa, chắc hẳn đã đau đầu với session: header Mcp-Session-Id, sticky session sau load balancer, kết nối SSE treo, handshake initialize mỗi lần nối lại. Bản spec MCP 2026-07-28 giải quyết tận gốc: giao thức trở thành stateless. Đây là thay đổi lớn nhất kể từ khi MCP ra đời, và ảnh hưởng trực tiếp tới cách bạn viết, deploy và scale server.
Những thay đổi lớn
| Trước (2025-xx) | Từ 2026-07-28 |
|---|---|
Handshake initialize / notifications/initialized | Bỏ handshake. Mỗi request tự mang phiên bản giao thức và capability của client trong _meta |
Session qua header Mcp-Session-Id | Bỏ session ở mức giao thức. Cần giữ trạng thái giữa các lần gọi thì server tự cấp "handle" và truyền như tham số tool bình thường |
| Biết server hỗ trợ gì qua kết quả initialize | RPC mới server/discover (bắt buộc ở server) để công bố phiên bản, capability, danh tính |
GET endpoint mở SSE + resources/subscribe | Một luồng duy nhất subscriptions/listen, client chọn loại thông báo muốn nhận |
| Server chủ động gửi request (sampling, elicitation, roots) | Mẫu Multi Round-Trip Request: server trả input_required, client gửi lại request kèm thông tin bổ sung |
Nối lại luồng SSE bằng Last-Event-ID | Bỏ resumability. Luồng đứt thì client gửi lại request mới |
Các thay đổi nhỏ đáng chú ý
- Mọi kết quả có trường bắt buộc
resultType:"complete"hoặc"input_required". - Kết quả
tools/list,resources/list… cóttlMsvàcacheScopeđể client cache; server nên trả danh sách tool theo thứ tự cố định, giúp tăng tỷ lệ trúng prompt cache phía LLM. - POST qua Streamable HTTP phải kèm header
Mcp-Method,Mcp-Name, thuận tiện cho gateway định tuyến và ghi log. - Mức log đặt theo từng request qua
_meta; bỏpingvàlogging/setLevel. - Tasks (tác vụ chạy lâu) chuyển thành extension chính thức, dùng polling
tasks/get. - Hỗ trợ truyền trace OpenTelemetry qua
_meta.
Bị deprecate
- Roots, Sampling, Logging: vẫn chạy trong thời gian chuyển tiếp (tối thiểu 12 tháng theo chính sách mới) nhưng triển khai mới không nên dùng. Gợi ý thay: truyền thư mục qua tham số tool, gọi thẳng API LLM thay vì sampling, log ra stderr hoặc OpenTelemetry.
- Transport HTTP+SSE cũ: chuyển sang Streamable HTTP.
- Dynamic Client Registration (OAuth): thay bằng Client ID Metadata Documents.
Vì sao stateless là tin tốt?
- Scale ngang dễ: request nào cũng xử lý được ở instance nào, không cần sticky session. Chạy trên serverless hay sau load balancer thông thường đều ổn.
- Ít trạng thái treo: không còn session hết hạn bí ẩn hay luồng SSE "chết" mà không ai biết.
- Dễ cache và quan sát: header chuẩn và TTL giúp gateway, proxy làm việc hiệu quả.
Rủi ro khi nâng cấp
- Hai "thời kỳ" cùng tồn tại: client cũ vẫn dùng handshake. Server nên hỗ trợ cả hai trong giai đoạn chuyển tiếp; MCP Inspector có chế độ
--protocol-era legacyvàmodernđể test cả hai. - Logic dựa vào session phải viết lại: giỏ hàng, phiên đăng nhập, ngữ cảnh hội thoại… chuyển sang handle tường minh.
- Mất luồng = mất request: tác vụ dài nên dùng extension tasks thay vì một luồng SSE kéo dài.
Áp dụng thế nào?
- Dev: Nâng SDK lên bản hỗ trợ 2026-07-28, chạy Inspector ở cả hai era, rà mọi chỗ dùng session hay sampling.
- Tech Lead: Tận dụng stateless để bỏ sticky session, đưa server MCP lên serverless; thêm trace OpenTelemetry ngay từ đầu.
- PM: Lên lộ trình chuyển đổi trong cửa sổ deprecate, ưu tiên các server công khai có nhiều client bên ngoài.
Nguồn & tham khảo
- Key Changes (2026-07-28) — Model Context Protocol
- MCP Inspector — Model Context Protocol