MCP chuyển stateless (spec 2026-07-28): checklist migrate MCP server

Spec MCP 2026-07-28 bỏ handshake và session id — MCP server chạy stateless sau load balancer thường. Checklist migrate cho server author, góc architect.

MCP chuyển stateless (spec 2026-07-28): checklist migrate MCP server
  • 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-Id sẽ 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, header Mcp-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-MethodMcp-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:

  1. 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.
  2. 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.
  3. 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.
  4. Phát header mới. Emit Mcp-MethodMcp-Name (SEP-2243) để hạ tầng định tuyến được mà không phải bới body.
  5. Chuyển luồng nhiều bước sang input-required. Thay vì giữ SSE mở chờ, trả InputRequiredResult (với inputRequests + requestState); client retry kèm inputResponsesrequestState đã echo — bất kỳ instance nào cũng xử lý được lần retry.
  6. 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ằng tasks/get, tasks/update, tasks/cancel (SEP-2663 — đây là breaking change).
  7. Siết auth. Theo các SEP hardening: validate iss theo RFC 9207 (SEP-2468), khai application_type OIDC khi Dynamic Client Registration (SEP-837), gắn credential theo issuer và 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.