- Bài toán: bản MCP spec lớn nhất từ trước tới nay (2026-07-28) bỏ session ở tầng giao thức — MCP server đang giữ session state sẽ phải migrate.
- Giải pháp: hiểu đúng cái gì bị bỏ (handshake, Mcp-Session-Id) và làm theo checklist migrate sang stateless: explicit handle, header mới, Tasks lifecycle, auth.
- Kết quả: một checklist gọn cho server author, cộng bối cảnh timeline để không hoảng (RC đã ra, chính sách deprecation tối thiểu 12 tháng).
Bản spec MCP 2026-07-28 — bản lớn nhất từ khi MCP ra đời — biến giao thức thành stateless: bỏ handshake initialize/initialized và header Mcp-Session-Id. Hệ quả thực tế cho người vận hành: MCP server remote chạy được sau một load balancer round-robin thường, không cần sticky session hay shared session store. Nếu bạn đang dùng MCP thì phần lớn là chuyện của SDK; nhưng nếu bạn viết MCP server có giữ state theo session, đây là bài migrate bạn cần lên lịch. Release candidate đã khoá (21/05/2026), spec chính thức phát hành 28/07/2026 — nên bài này là để chuẩn bị đúng lúc.
TL;DR (Executive Summary)
- Bài toán: MCP bỏ session ở tầng giao thức. Server nào pin client vào một instance qua
Mcp-Session-Idsẽ phải đổi cách giữ state.- Giải pháp: Hiểu cái gì bị bỏ (handshake, session id,
tasks/list) và cái gì thêm (_meta,server/discover, headerMcp-Method/Mcp-Name), rồi chạy checklist migrate: explicit handle thay session, phát header mới, chuyển Tasks sang lifecycle mới, siết auth.- Kết quả: Một checklist gọn cho server author — không hoảng, vì chính sách deprecation mới cho tối thiểu 12 tháng.
"Stateless" là chuyện lớn tới đâu (góc architect)
Trước bản này, một MCP server remote thường phải nhớ client: cái handshake initialize mở phiên, rồi Mcp-Session-Id gắn client vào đúng một instance. Muốn scale ngang, bạn phải sticky-route theo session id hoặc dựng một shared store để mọi instance đọc chung — đúng loại phức tạp mà ai từng vận hành hệ phân tán đều ngán.
Spec 2026-07-28 gỡ bỏ chính chỗ đó. Không handshake, không session id ở tầng giao thức: bất kỳ request nào cũng tới được bất kỳ instance nào. Server chạy trên hạ tầng HTTP bình thường, scale bằng round-robin, không cần sticky. Với người làm delivery/vận hành, đây là bớt một tầng hạ tầng phải nuôi — nhưng đổi lại, code server đang giả định "có session" thì phải viết lại cách giữ state.
Cái gì bị bỏ, cái gì thêm
| Chi tiết | SEP | |
|---|---|---|
| Bỏ | Handshake initialize/initialized |
SEP-2575 |
| Bỏ | Header Mcp-Session-Id + quản lý session ở tầng giao thức |
SEP-2567 |
| Bỏ | Method tasks/list (không an toàn khi không còn session) |
— |
| Thêm | Client info + capabilities đi trong _meta trên mỗi request |
— |
| Thêm | Method server/discover để client lấy capabilities từ đầu |
— |
| Thêm | Header Mcp-Method và Mcp-Name (định tuyến không cần đọc body) |
SEP-2243 |
Mấu chốt tư duy: state không biến mất, nó chuyển từ ẩn trong transport sang hiển trong hội thoại. Thay vì server nhớ phiên, server phát cho model một handle tường minh và model mang nó theo.
Checklist migrate MCP server sang stateless
Đây là phần cốt lõi — thứ tự tôi sẽ làm nếu migrate một MCP server đang chạy:
- Nâng SDK. Chờ SDK ngôn ngữ của bạn ra bản hỗ trợ spec 2026-07-28 (Tier 1 SDK dự kiến trong cửa sổ validation 10 tuần). Đừng tự chế trước khi SDK sẵn sàng.
- Bỏ mọi giả định
Mcp-Session-Id. Rà soát chỗ nào server đọc session id để tra state. Đây là điểm vỡ chính. - Thay session bằng explicit handle. Cho tool "mint" một handle (ví dụ
basket_id,browser_id) và trả về; thiết kế các tool sau nhận handle đó như một tham số bình thường. State giờ do model cầm và truyền lại. - Phát header mới. Emit
Mcp-MethodvàMcp-Name(SEP-2243) để hạ tầng định tuyến được mà không phải bới body. - Chuyển luồng nhiều bước sang input-required. Thay vì giữ SSE mở chờ, trả
InputRequiredResult(vớiinputRequests+requestState); client retry kèminputResponsesvàrequestStateđã echo — bất kỳ instance nào cũng xử lý được lần retry. - Chuyển Tasks sang lifecycle mới. Nếu dùng Tasks thử nghiệm (bản
2025-11-25), đổi sang: server trả task handle ởtools/call, client điều khiển bằngtasks/get,tasks/update,tasks/cancel(SEP-2663 — đây là breaking change). - Siết auth. Theo các SEP hardening: validate
isstheo RFC 9207 (SEP-2468), khaiapplication_typeOIDC khi Dynamic Client Registration (SEP-837), gắn credential theoissuervà re-register khi đổi (SEP-2352).
Cách đọc checklist cho gọn: bước 2–3 là linh hồn của migrate (bỏ session, dùng handle tường minh); phần còn lại là header, Tasks và auth đi kèm. Server chỉ đọc/không giữ state thì gần như không phải làm gì.
Extensions: MCP Apps và Tasks thành công dân hạng nhất
Bản này chuẩn hoá một khung Extensions (SEP-2133): dùng định danh reverse-DNS, thương lượng qua map extensions trong capabilities, sống ở repo ext-* và version độc lập với spec. Hai extension chính thức đáng chú ý:
- MCP Apps (SEP-1865) — server gửi giao diện HTML tương tác, host render trong iframe sandbox. Tool khai UI template trước để host prefetch, cache và soi bảo mật; UI nói chuyện lại qua chính JSON-RPC nền, nên mọi hành động đi cùng đường audit như tool call thường. Đây là bước MCP bước từ "trả text/dữ liệu" sang "trả cả giao diện".
- Tasks (SEP-2663) — chuẩn cho việc chạy dài mà không cần giữ kết nối: server trả một task handle, client hỏi trạng thái bằng
tasks/get,tasks/update,tasks/cancel.
Đừng hoảng: có chính sách deprecation
Bản này cũng lần đầu có chính sách deprecation chính thức (SEP-2577): mỗi tính năng đi qua Active → Deprecated → Removed, tối thiểu 12 tháng giữa deprecate và removal. Ba thứ bị deprecate dạng annotation trong bản này (vẫn chạy bình thường):
| Deprecated | Thay bằng |
|---|---|
| Roots | Tham số tool, resource URI, hoặc config server |
| Sampling | Gọi thẳng API của nhà cung cấp LLM |
| Logging | stderr (stdio) hoặc OpenTelemetry (structured) |
Nếu bạn học MCP nâng cao thì đây đúng ba cơ chế hay được nhắc — nay spec khuyến nghị hướng khác, nhưng có ít nhất 12 tháng để đổi, không vỡ vào 28/07.
Kết
MCP "lớn lên": từ một giao thức có session, đầy trạng thái ẩn, sang một lõi stateless chạy trên HTTP thường, cộng khung extension để mở rộng có kỷ luật. Với người dùng MCP, phần lớn là chuyện SDK lo. Với người viết MCP server, thông điệp gọn: bỏ session, chuyển state thành handle tường minh, phát header mới — và bạn có ít nhất một năm cho những phần deprecate.
Nối mạch để đi sâu: nền tảng MCP (client/server, ba capability, transport) ở ghi chú khoá Model Context Protocol; phần stateless_http / Streamable HTTP / session id — đúng thứ spec này thay đổi — nằm ở MCP nâng cao. Còn khi bạn xây agent gọi những server này, xem Claude Agent SDK vs Claude API vs Claude Code; và lớp agent thao tác web thì xem WebMCP. Toàn bộ lộ trình gom ở /learn/claude.
Câu hỏi thường gặp
MCP 2026-07-28 thay đổi gì lớn nhất?
Giao thức trở thành stateless: bỏ handshake initialize/initialized và header Mcp-Session-Id. Bất kỳ request nào cũng có thể tới bất kỳ instance server nào, nên MCP server remote chạy được sau load balancer round-robin thường mà không cần sticky session hay shared session store.
MCP server hiện tại của tôi có vỡ ngay 28/07 không?
Không vỡ ngay. Spec có chính sách deprecation mới (SEP-2577): tính năng đi qua Active → Deprecated → Removed, tối thiểu 12 tháng giữa deprecate và removal. Bản này chủ yếu deprecate dạng annotation (Roots, Sampling, Logging) — chúng vẫn chạy. Nhưng server dựa vào session id thì nên lên kế hoạch migrate.
Bỏ session thì giữ state ở đâu?
Thay vì dựa vào session ẩn trong transport, server 'mint' một handle tường minh từ một tool (ví dụ basket_id, browser_id) rồi để model truyền lại như một tham số bình thường ở các lần gọi sau. State trở nên hiển thị với model thay vì giấu trong metadata.
MCP Apps và Tasks là gì?
Hai extension chính thức trong khung Extensions mới. MCP Apps (SEP-1865) cho server gửi giao diện HTML tương tác, host render trong iframe sandbox. Tasks (SEP-2663) chuẩn hoá việc chạy dài: server trả task handle, client điều khiển bằng tasks/get, tasks/update, tasks/cancel.