- MCP(Model Context Protocol) cung cấp một phương thức tích hợp được chuẩn hóa để LLM tương tác với thế giới bên ngoài
- Gần đây, các tiêu chuẩn tương tự như ACP của IBM và A2A của Google xuất hiện, kéo theo số lượng triển khai MCP và các công cụ liên quan tăng nhanh
- Tuy nhiên, các thực hành kỹ thuật còn non nớt như thiết kế gây nhầm lẫn, tài liệu thiếu sót, thiếu đặc tả giao thức thực tế đang bị chỉ ra là vấn đề
- Các phương thức truyền tải hiện được đề xuất như HTTP+SSE và Streamable HTTP làm gia tăng độ phức tạp và các vấn đề bảo mật, và việc dùng WebSocket được khuyến nghị như một phương án thay thế
- Giao thức mới nhất đang bổ sung sự thiếu nhất quán và độ phức tạp quá mức trong ủy quyền và quản lý phiên
Xem xét MCP và các xu hướng gần đây
- MCP là một giao thức mở được tạo ra để chuẩn hóa cách các ứng dụng cung cấp ngữ cảnh cho mô hình ngôn ngữ lớn (LLM)
- Trong một tháng gần đây, MCP nổi lên như tiêu chuẩn cốt lõi để biến LLM thành agent, và việc sử dụng cũng như triển khai đang lan rộng rất nhanh
- Các tiêu chuẩn chính thống có mục đích tương tự như ACP của IBM hay A2A của Google cũng đang xuất hiện nhanh chóng
Các vấn đề về thực hành kỹ thuật và đặc tả giao thức
- Mức độ triển khai thực tế và tài liệu hóa còn thấp được bộc lộ ở nhiều nơi
- Các công ty công nghệ lớn đầu tư khổng lồ vào huấn luyện mô hình, nhưng SDK và tài liệu lại ở mức kém, gây ra sự bối rối cho người dùng
- MCP cũng cho thấy những vấn đề tương tự: một số thiết kế thiếu hợp lý, trong khi đặc tả, ví dụ và hướng dẫn vẫn còn thiếu
Bàn về giao thức truyền tải (Transport)
Phương thức truyền tải stdio
- Stdio là cách truyền thống để kết nối trực tiếp máy chủ MCP và client cục bộ qua pipe (
stdout, stdin)
- Cách này ít phải xử lý socket phức tạp hay các vấn đề theo từng hệ điều hành, đồng thời cho phép cấu hình môi trường gọn nhẹ như biến môi trường và luồng vào/ra
Phương thức HTTP+SSE / Streamable HTTP
- Với ý định hỗ trợ cả nền tảng HTTP phù hợp thời đại web, các phương thức HTTP+SSE và Streamable HTTP đã được chấp nhận
- Tuy nhiên, trong khi nhắm tới việc thay thế WebSocket, cách này lại gây ra nhiều mơ hồ, rối rắm trong thiết kế và độ phức tạp hơn
- Một phiên và kết nối có thể được tạo hoặc kết thúc theo nhiều cách khác nhau, tạo gánh nặng lớn cho việc quản lý trạng thái và bảo mật phía máy chủ
Khó khăn trong các trường hợp triển khai máy chủ/client MCP
- Vấn đề hỗ trợ còn yếu ở nhiều ngôn ngữ, như việc thiếu Go SDK chính thức, là điều đặc biệt nổi bật
- Do tài liệu và đặc tả không rõ ràng, nhiều trường hợp phải triển khai thông qua reverse engineering
- Dù các máy chủ mẫu chủ yếu dựa trên Python, JavaScript, nhưng các vấn đề về phụ thuộc và tính khả chuyển khiến khó áp dụng vào môi trường làm việc thực tế
- Khi triển khai máy chủ, SSE/Streamable HTTP cố giả lập socket, nhưng trên thực tế rất khó duy trì nhất quán trạng thái phiên và kết nối, đồng thời còn cần hạ tầng riêng như hàng đợi thông điệp
Cấu trúc và vấn đề của HTTP+SSE và Streamable HTTP
Chế độ HTTP+SSE
- Client mở một phiên SSE với máy chủ, rồi khi gửi yêu cầu ghi tới một endpoint riêng, máy chủ trả về phản hồi 202 và gửi kết quả qua kết nối SSE hiện có
- Việc duy trì đồng bộ trạng thái và kết nối phiên là cần thiết, nhưng quá trình này vừa thiếu tài liệu vừa có độ phức tạp vận hành rất cao
Chế độ Streamable HTTP
- Tạo phiên, mở SSE, truyền phản hồi đều bị trộn lẫn theo nhiều cách, khiến luồng một yêu cầu ~ phản hồi không còn nhất quán
- Nhiều lớp quản lý trạng thái cùng tồn tại, nhiều endpoint và cách dùng header đan xen, tạo ra trở ngại nghiêm trọng cho khả năng triển khai thực tế và mở rộng
Hàm ý chung
- Cùng với việc độ phức tạp kỹ thuật tăng lên, gánh nặng nhận thức và bảo trì của lập trình viên cũng lớn hơn, đồng thời nảy sinh các vấn đề như không tương thích, hành vi khó đoán trước giữa nhiều cách triển khai máy chủ và client
- Máy chủ phải theo dõi mọi trạng thái và tình huống kết nối; trong môi trường phân tán, việc mở rộng hiệu quả và đồng bộ trạng thái càng trở nên khó khăn hơn
Hàm ý về bảo mật
- Các cách kết nối/phiên đa dạng và vi mô làm gia tăng các lỗ hổng bảo mật trong quản lý trạng thái như chiếm quyền phiên, tấn công phát lại, từ chối dịch vụ (DoS)
- Nhiều điểm vào và nhiều cách phản hồi mở rộng bề mặt tấn công, đồng thời có thể cho phép che giấu hoạt động độc hại qua những luồng ngoài dự kiến
Sự rối rắm trong giao thức quản lý quyền hạn (Authorization)
- Đặc tả hiện tại áp dụng các quy tắc thiếu nhất quán, chẳng hạn chỉ bắt buộc OAuth2 với truyền tải HTTP, còn truyền tải STDIO thì tùy ý dùng biến môi trường
- Điều này tạo ra sự khó hiểu và bất hợp lý, ví dụ như tại sao chỉ truyền tải HTTP lại bị ép phải triển khai OAuth2 phức tạp
Đề xuất hướng cải thiện
- Cần đơn giản hóa về một giao thức JSON RPC thống nhất, với phương thức truyền tải thực chất chỉ tập trung vào Stdio và WebSocket
- Cách tiếp cận phù hợp là ánh xạ biến trong môi trường Stdio thành header trong môi trường HTTP, còn đầu vào/đầu ra thì ánh xạ tương ứng thành các luồng hai chiều của WebSocket
- Nhờ đó có thể loại bỏ việc theo dõi phiên không cần thiết, quản lý trạng thái và vô số xử lý ngoại lệ
- WebSocket nên trở thành lựa chọn tiêu chuẩn cho mọi truyền tải dựa trên HTTP, đồng thời cũng giải quyết được các vấn đề đồng bộ trạng thái phức tạp
So sánh với các giao thức thay thế và xu hướng thị trường
- ACP của IBM và A2A của Google cung cấp thiết kế Transport gọn gàng hơn và khả năng khám phá agent tốt hơn về mặt liên thông giữa các agent
- Nhưng về bản chất, phần lớn chúng vẫn chỉ ở mức có thể được tích hợp như công cụ riêng trong môi trường xây dựng MCP
- Việc các giao thức mới tiếp tục xuất hiện có nguy cơ dẫn tới sự phân mảnh tiêu chuẩn, vì vậy ưu tiên sự đơn giản của Transport là điều quan trọng cho tăng trưởng của ngành
1 bình luận
Ý kiến trên Hacker News