Bỏ qua đến nội dung chính

State and the StreamableHTTP transport

📖 Nội dung bài học

Tóm tắt

Các cờ (flag) stateless_httpjson_response trong MCP server kiểm soát các khía cạnh cơ bản về cách server của bạn hoạt động. Hiểu rõ khi nào và tại sao nên sử dụng chúng là điều cực kỳ quan trọng, đặc biệt nếu bạn dự định mở rộng quy mô server hoặc triển khai trên môi trường production.

Khi nào bạn cần Stateless HTTP

Hãy tưởng tượng bạn xây dựng một MCP server và nó trở nên phổ biến. Ban đầu, bạn có thể chỉ có vài client kết nối tới một instance server duy nhất:

Khi server phát triển, bạn có thể có hàng ngàn client cố gắng kết nối. Chạy một instance server duy nhất sẽ không thể mở rộng để xử lý tất cả lưu lượng đó:

Giải pháp điển hình là mở rộng quy mô theo chiều ngang (horizontal scaling) - chạy nhiều instance server đằng sau một bộ cân bằng tải (load balancer):

Nhưng đây là lúc mọi thứ trở nên phức tạp. Hãy nhớ rằng các MCP client cần hai kết nối riêng biệt:

  • Một kết nối GET SSE để nhận các yêu cầu từ server gửi đến client
  • Các request POST để gọi tool và nhận phản hồi

Với load balancer, các request này có thể được điều hướng đến các instance server khác nhau. Nếu tool của bạn cần dùng Claude (thông qua sampling), server xử lý request POST sẽ cần phối hợp với server đang duy trì kết nối GET SSE. Điều này tạo ra một vấn đề điều phối (coordination problem) phức tạp giữa các server.

Cách Stateless HTTP giải quyết vấn đề này

Thiết lập stateless_http=True sẽ loại bỏ vấn đề điều phối này, nhưng đi kèm với những sự đánh đổi (trade-off) đáng kể:

Khi stateless HTTP được bật:

  • Client không nhận được session ID - server không thể theo dõi từng client riêng lẻ
  • Không có yêu cầu từ server đến client - đường truyền GET SSE không còn khả dụng
  • Không có sampling - không thể dùng Claude hoặc các mô hình AI khác
  • Không có báo cáo tiến độ (progress report) - không thể gửi cập nhật tiến độ trong các tác vụ dài
  • Không có đăng ký nhận tin (subscription) - không thể thông báo cho client về các cập nhật resource

Tuy nhiên, có một lợi ích: không còn yêu cầu khởi tạo client. Client có thể gửi request trực tiếp mà không cần quá trình bắt tay (handshake) ban đầu.

Hiểu về JSON Response

Cờ json_response=True đơn giản hơn - nó chỉ vô hiệu hóa streaming cho các phản hồi của request POST. Thay vì nhận được nhiều thông điệp SSE khi một tool thực thi, bạn chỉ nhận được kết quả cuối cùng dưới dạng JSON thuần túy.

Khi vô hiệu hóa streaming:

  • Không có thông điệp tiến độ trung gian
  • Không có các dòng log trong quá trình thực thi
  • Chỉ có kết quả cuối cùng của tool

Khi nào nên dùng các cờ này

Dùng stateless HTTP khi:

  • Bạn cần horizontal scaling với load balancer
  • Bạn không cần giao tiếp từ server đến client
  • Các tool của bạn không yêu cầu AI model sampling
  • Bạn muốn giảm thiểu chi phí thiết lập kết nối (overhead)

Dùng JSON response khi:

  • Bạn không cần streaming phản hồi
  • Bạn thích các phản hồi HTTP đơn giản, không phải dạng streaming
  • Bạn đang tích hợp với các hệ thống mong đợi JSON thuần túy

Phát triển (Development) vs Triển khai (Production)

Nếu bạn đang phát triển cục bộ với transport I/O tiêu chuẩn (standard I/O transport) nhưng dự định triển khai với transport HTTP, hãy kiểm tra với cùng loại transport mà bạn sẽ dùng trên production. Sự khác biệt về hành vi giữa chế độ stateful và stateless có thể rất lớn, và tốt nhất là nên phát hiện mọi vấn đề trong quá trình phát triển thay vì sau khi đã triển khai.

Các cờ này thay đổi căn bản cách MCP server của bạn vận hành, vì vậy hãy chọn chúng dựa trên yêu cầu cụ thể về khả năng mở rộng và chức năng của bạn.

Tải xuống

🔁 Bài học liên quan

📚 Nguồn & ghi nhận

Bài học có hữu ích không?

Góp ý / Báo lỗiPhát hiện sai sót hoặc có ý tưởng cải thiện?