MCP vừa có bản phát hành lớn nhất kể từ khi ra mắt.
Ngày 28/7, các nhà bảo trì đã phát hành bản đặc tả 2026-07-28, thay đổi cách thức hoạt động của các máy chủ MCP ở cấp độ cơ bản. Giao thức bắt tay (handshake) đã bị loại bỏ. Phiên làm việc (sessions) không còn tồn tại. Ba tính năng đã có từ lâu bị loại bỏ.
Chính các nhà bảo trì đã gọi đây là thay đổi đáng kể nhất kể từ khi tính năng ủy quyền (authorization) được bổ sung. Đây là lời của họ, không phải của tôi.
Nghe có vẻ đáng sợ. Nhưng thực tế, điều này giúp việc triển khai các máy chủ MCP trở nên dễ dàng hơn nhiều. Và mục đích của tôi ở đây là gì? Tôi ở đây để giúp bạn xây dựng và triển khai một máy chủ.
Máy chủ MCP của bạn giờ đây chỉ là một dịch vụ HTTP không trạng thái thông thường. Cân bằng tải luân phiên (Round-robin load ba)
MCP vừa có bản phát hành lớn nhất kể từ khi ra mắt.
Ngày 28/7, các nhà bảo trì đã phát hành bản đặc tả 2026-07-28, và nó thay đổi cách thức hoạt động của các máy chủ MCP ở một cấp độ khá cơ bản. Giao thức bắt tay đã bị loại bỏ. Các phiên làm việc đã bị loại bỏ. Ba tính năng tồn tại lâu đời đã bị loại bỏ.
Chính các nhà bảo trì đã gọi đây là thay đổi đáng kể nhất kể từ khi tính năng ủy quyền được thêm vào. Đó là lời của họ, không phải của tôi.
Nghe có vẻ đáng sợ. Nhưng thực tế nó giúp việc triển khai các máy chủ MCP dễ dàng hơn nhiều. Và tôi ở đây để làm gì? Tôi ở đây để giúp bạn xây dựng và triển khai một máy chủ như vậy.
Máy chủ MCP của bạn giờ đây chỉ là một dịch vụ HTTP không trạng thái thông thường. Cân bằng tải luân phiên (round-robin), tự động mở rộng quy mô (autoscaling) và bộ nhớ đệm (caching) đều hoạt động. Không có phiên làm việc cố định (sticky sessions) hay trạng thái phiên làm việc chia sẻ.
Trong hướng dẫn này, chúng ta sẽ xây dựng một máy chủ MCP nhỏ theo bản đặc tả mới, kết nối một máy khách với nó, xem mọi tính năng nổi bật thực sự hoạt động, và sau đó triển khai nó lên Cloudflare Workers. Miễn phí.
ℹ️ Tất cả mã ở đây đều sử dụng SDK TypeScript v2 mới, được phát hành cùng với bản đặc tả. Nếu bạn đang sử dụng gói @modelcontextprotocol/sdk cũ, đó là v1 hiện tại.
Nội dung được đề cập
Những thay đổi thực sự trong bản đặc tả 2026-07-28 một cách ngắn gọn
Xây dựng máy chủ MCP với SDK v2 mới
Hoạt động của lõi không trạng thái
MRTR: cách một công cụ yêu cầu xác nhận từ người dùng mà không giữ luồng mở
Một phương án dự phòng linh hoạt cho các máy khách chưa hỗ trợ MRTR (có rất nhiều)
Danh sách công cụ có thể lưu vào bộ nhớ đệm với ttlMs
Kiểm tra nó với một máy khách và lệnh curl thô
Triển khai nó lên Cloudflare Workers với gói miễn phí
Thay đổi trong bản đặc tả MCP mới (2026-07-28)
Tóm tắt nhanh những điểm mới. Nếu bạn muốn xem toàn bộ nhật ký thay đổi, nó có trên trang web đặc tả chính thức.
Giao thức bắt tay đã bị loại bỏ
Việc trao đổi initialize / initialized và tiêu đề Mcp-Session-Id đã chính thức bị loại bỏ.
Mỗi yêu cầu giờ đây tự mô tả. Nó mang theo phiên bản giao thức, định danh máy khách và khả năng của nó trong _meta. Bất kỳ yêu cầu nào cũng có thể đến bất kỳ phiên bản máy chủ nào đằng sau một bộ cân bằng tải đơn giản. Thật nhẹ nhõm!!
Có một RPC server/discover tùy chọn nếu máy khách muốn biết các khả năng trước. Nhưng nó là tùy chọn. Một POST trần trụi giờ đây là một cuộc hội thoại hoàn chỉnh.
Yêu cầu đa vòng (Multi Round-Trip Requests - MRTR)
Đây là điểm tôi yêu thích nhất.
Trước đây, nếu một công cụ cần thứ gì đó từ người dùng giữa cuộc gọi, chẳng hạn như xác nhận hoặc một tham số bị thiếu, máy chủ phải đẩy một yêu cầu elicitation/create trở lại qua một luồng đang mở. Điều đó có nghĩa là bạn cần một luồng đang mở, điều này không tốt cho việc triển khai không trạng thái.
MRTR đảo ngược điều đó. Máy chủ trả về resultType: "input_required" với các câu hỏi cần được trả lời, và đóng kết nối. Máy khách thu thập các câu trả lời và thử lại cuộc gọi ban đầu với chúng được đính kèm, cộng với một mã thông báo requestState không rõ ràng để máy chủ biết nó đã dừng lại ở đâu.
Không có luồng mở. Không có phiên làm việc. Các công cụ tương tác trên cơ sở hạ tầng hoàn toàn không trạng thái.
Định tuyến dựa trên tiêu đề
Các yêu cầu giờ đây mang các tiêu đề HTTP Mcp-Method và Mcp-Name. Cổng kết nối, bộ giới hạn tốc độ hoặc Tường lửa ứng dụng web (WAF) của bạn có thể định tuyến và đo lường dựa trên các tiêu đề mà không cần phân tích cú pháp các phần thân JSON.
Kết quả danh sách có thể lưu vào bộ nhớ đệm
Các phản hồi tools/list, prompts/list, resources/list và resources/read giờ đây mang các trường ttlMs và cacheScope, được mô phỏng theo Cache-Control của HTTP. Các máy khách lưu trữ danh mục công cụ của bạn thay vì tìm nạp lại mỗi khi chúng kết nối.
Khung mở rộng + loại bỏ
Các tác vụ đã được chuyển từ lõi thử nghiệm sang một tiện ích mở rộng chính thức (io.modelcontextprotocol/tasks). Các ứng dụng MCP và ủy quyền được quản lý doanh nghiệp (Enterprise Managed Authorization) cũng nằm ở đó. Bạn cũng có thể xây dựng các tiện ích mở rộng của riêng mình.
Và các tính năng bị loại bỏ:
Các tính năng Roots, Sampling và Logging đã bị loại bỏ. Chúng sẽ tiếp tục hoạt động trong ít nhất 12 tháng, nhưng các triển khai mới không nên sử dụng chúng.
Giao thức truyền tải HTTP+SSE cũ đã bị loại bỏ với thời gian chuyển đổi là một năm.
Đăng ký máy khách động (Dynamic Client Registration) đã bị loại bỏ để ưu tiên Tài liệu siêu dữ liệu ID máy khách (Client ID Metadata Documents - CIMD).
Hiện tại cũng có một chính sách loại bỏ chính thức: thời gian tối thiểu 12 tháng cho bất kỳ tính năng nào được đánh dấu là đã loại bỏ. Điều này giúp người dùng có thể lên kế hoạch nâng cấp.
**Phân tách SDK**
Một điều nữa trước khi chúng ta bắt đầu xây dựng: SDK TypeScript không còn là một gói duy nhất.
Phiên bản v2 chia nó thành @modelcontextprotocol/server, @modelcontextprotocol/client và các bộ điều hợp khung mỏng (@modelcontextprotocol/hono, express, fastify, node).
**Xây dựng máy chủ MCP**
Cuối cùng, chúng ta sẽ bắt đầu xây dựng. Chúng ta sẽ xây dựng một bot triển khai nhỏ gọn trên MCP.
Nó có ba công cụ:
* `deploy` yêu cầu người dùng xác nhận trước khi triển khai (MRTR đang hoạt động).
* `list_deployments` đọc lại lịch sử triển khai.
* `server_stats` chứng minh một phiên bản máy chủ mới đã xử lý mọi yêu cầu.
Đây là mẹo hữu ích khi triển khai: tất cả logic MCP nằm trong một tệp độc lập với nền tảng (bot.ts), và mỗi nền tảng có một tệp đầu vào nhỏ. Node sử dụng server.ts. Cloudflare sử dụng worker.ts. Cả hai đều chỉ khoảng mười dòng. Một máy chủ MCP theo đặc tả mới chỉ là một trình xử lý fetch; nền tảng là một shim phục vụ.
Bạn sẽ hiểu mọi thứ trong quá trình thực hiện.
**Bước 1: Cài đặt SDK v2**
Chạy lệnh sau:
```
mkdir updated-mcp-spec-bot && cd updated-mcp-spec-bot
npm init -y && npm pkg set type=module
npm install @modelcontextprotocol/server @modelcontextprotocol/client \
@modelcontextprotocol/hono @hono/node-server hono zod tsx
```
ℹ️ Trên TypeScript 6+, hãy thêm `"types": ["node"]` vào `tsconfig compilerOptions` của bạn sau khi cài đặt `@types/node`. TS 6 không còn tự động bao gồm `@types/*`, và bạn sẽ gặp lỗi `Cannot find name 'process'` nếu không có nó.
**Bước 2: Logic máy chủ**
Tạo tệp bot.ts. Đây là toàn bộ máy chủ MCP, không có mã nền tảng nào trong đó:
```
// 👇 bot.ts
import type {
CallToolResult,
InputRequiredResult,
} from "@modelcontextprotocol/server";
import {
acceptedContent,
CLIENT_CAPABILITIES_META_KEY,
createRequestStateCodec,
inputRequired,
McpServer,
} from "@modelcontextprotocol/server";
import * as z from "zod/v4";
const deployments: { env: string; at: string }[] = [];
let requestsServed = 0;
type DeployState = { step: "confirm"; env: string };
// set STATE_KEY in production so all instances share the secret
// lazy init: Workers forbids ge
```
Nguồn tin: Dev.to AI — Tác giả: Shrijal Acharya. Bản dịch tiếng Việt do AI thực hiện, có thể có sai sót.