Xin chào! Lâu lắm rồi chúng ta mới quay lại chuỗi bài viết về xây dựng máy chủ MCP. Thời gian vừa qua do có nhiều công việc nên hôm nay tôi mới để dành ra được thời gian mà viết tiếp.
Đặc tả MCP nêu rất rõ cơ chế xác thực nên dùng cho một máy chủ MCP remote. Về cơ bản đó là quy trình xác thực theo đặc tả Oauth 2.1. Nói tóm tắt thì có các bước như sau:
Bước 1: Máy khách tự khám phá máy chủ MCP, hỏi xem có cần xác thực trước khi sử dụng không? Máy chủ đáp ứng yêu cầu bằng cách phản hồi lại không cần hoặc có. Nếu có thì phải chỉ ra các đường dẫn để người dùng xác thực.
Bước 2: Máy khách điều hướng người dùng đến các trang xác thực theo chỉ dẫn từ máy chủ.
Bước 3: Người dùng xác thực.
Bước 4: Hoàn tất quá trình xác thực và bắt đầu sử dụng như bình thường.
Nhìn chung 4 bước rất rõ ràng nhưng ẩn chứa đằng sau nó là cả một quá trình phức tạp, đòi hỏi nhiều nỗ lực triển khai cho cả hai phía, tức là nếu bạn triển khai máy chủ MCP xác thực theo luồng Oauth 2.1 thì máy khách cũng phải hỗ trợ luồng xác thực đó, nếu không thì không thể sử dụng. Tôi dành nhiều thời gian tìm hiểu mà hầu như không thấy có máy khách miễn phí nào triển khai luồng xác thực Oauth 2.1.
Vì quá phức tạp cho nên tôi không tiếp tục tìm hiểu sâu hơn vào quy trình này nữa. Thay vào đó chúng ta nên tiếp cận với 2 cách đơn giản hơn dưới đây.
Đầu tiên là đối với máy chủ MCP cục bộ như đã nhắc đến ở bài viết trước. Máy chủ MCP cục bộ là những máy chủ sử dụng npx hoặc node để chạy một tiến trình Node.js trong máy và trả về kết quả. Cấu hình trông giống như sau.
{
"mcpServers": {
"mcp-2coffee": {
"command": "node",
"args": [
"/path/to/mcp-2coffee/build/index.js"
]
}
}
}
/path/to/mcp-2coffee/build/index.js có thể chứa cuộc gọi API đến một máy chủ nào đó yêu cầu xác thực bằng API Key hoặc Authorization trong headers... Để làm được điều đó chỉ cần cấu hình thêm giá trị env. Khi đó mã xử lý chỉ cần lấy biến đó từ env do người dùng chỉ định.
{
"mcpServers": {
"mcp-2coffee": {
"command": "node",
"args": [
"/path/to/mcp-2coffee/build/index.js"
],
"env": {
"X-API-KEY": "xxx..xxx"
}
}
}
}
Đối với máy chủ MCP remote cách làm cũng gần tương tự như trên, chỉ có điều thay vì thêm thuộc tính env thì thêm trong headers.
"mcp-2coffee-remote": {
"command": "npx",
"args": [
"mcp-remote@0.1.18",
"http://localhost:3000/mcp",
"--header",
"X-API-KEY: xxx..xxx"
]
}
Tuy nhiên đây chỉ là giải pháp tạm thời nhằm giảm đi sự phức tạp trong triển khai xác thực cho máy chủ MCP remote. Mặc dù Anthropic đang nỗ lực cải tiến đặc tả MCP nhưng xem ra nó đang trở nên phức tạp và phân mảnh hơn. Hy vọng rằng trong tương lai gần chúng ta sớm có phương án giải quyết triệt để vấn đề này.
Mã triển khai máy chủ bạn đọc có thể tham khảo trên Github. Trong bài viết tiếp theo chúng ta sẽ cùng nhau tìm hiểu cách tạo một MCP Client nhé.