Bỏ qua điều hướng

MCP Client là gì? Vai trò và cách hoạt động

MCP Client là thành phần kết nối ứng dụng AI với các nguồn dữ liệu ngoại vi theo giao thức MCP, giữ an toàn dữ liệu và quản lý ngữ cảnh hiệu quả.

Tuan Tran Van
18 phút đọc
Mục lục (8 phần)
  1. MCP Client là gì?
  2. Client làm gì trong một phiên kết nối?
  3. Elicitation, sampling và roots: những gì client cung cấp cho server
  4. Vì sao roots và sampling bị deprecated nhưng vẫn còn dùng?
  5. Những ứng dụng nào đang là MCP client?
  6. Vì sao client là chốt kiểm soát bảo mật?
  7. Khi nào bạn cần tự viết một MCP client?
  8. Tài liệu tham khảo

Trình khách MCP (MCP Client) là thành phần kỹ thuật duy trì kết nối logic với máy chủ MCP (MCP Server) để lấy ngữ cảnh (context) và các công cụ (tools) cho ứng dụng chủ (MCP Host).

Trong kiến trúc Model Context Protocol (MCP), Client không chỉ là một đầu nối đơn thuần, mà còn là lớp trung gian điều phối: nó chuẩn hóa dữ liệu và thực thi các giao thức bảo mật trước khi thông tin được đưa vào mô hình ngôn ngữ lớn (LLM).

Bạn có thể coi Client là "đại diện" của ứng dụng AI trong việc giao tiếp với thế giới dữ liệu bên ngoài.

Kiến trúc MCP ra đời để giải quyết triệt để bài toán N + M trong tích hợp hệ thống. Trước đây, nếu bạn có N ứng dụng AI và M nguồn dữ liệu (như GitHub, Slack, Postgres), bạn sẽ cần xây dựng N × M cổng kết nối riêng biệt, và điều đó dẫn đến sự phân mảnh, chi phí bảo trì khổng lồ cùng những lỗ hổng bảo mật tiềm tàng. Với MCP Client, con số này giảm xuống còn N + M, bởi một Client duy nhất bên trong ứng dụng AI có thể giao tiếp với bất kỳ Server nào thông qua một giao thức chung, tạo ra một hệ sinh thái tác nhân AI (AI agent) có khả năng cộng dồn giá trị thay vì phân tán.

Sự chuyển dịch sang MCP đang diễn ra rất nhanh trong giới kỹ thuật, nhanh hơn nhiều so với những gì một giao thức mới thường đạt được. Riêng các bộ công cụ phát triển phần mềm (SDK) cho Python và TypeScript hiện đạt mốc khoảng 97 triệu lượt tải xuống hàng tháng, cho thấy cộng đồng kỹ sư đang chấp nhận Client như một tiêu chuẩn để tích hợp các tính năng tác nhân vào ứng dụng AI.

Minh hoạ MCP Client là cầu nối giữa một ứng dụng AI và nhiều máy chủ dữ liệu bên ngoài

MCP Client là gì?

Để bóc tách khái niệm MCP Client, bạn cần nhìn vào bức tranh tổng thể gồm ba thực thể: ứng dụng chủ (MCP Host), trình khách (MCP Client) và máy chủ (MCP Server). Host là phần mềm mà người dùng tương tác trực tiếp, ví dụ như Claude Desktop, Cursor hoặc Visual Studio Code (VS Code). Bên trong Host đó, một hoặc nhiều đối tượng Client sẽ được khởi tạo để làm nhiệm vụ "nói chuyện" với các Server tương ứng, còn Server là thực thể cung cấp tài nguyên hoặc công cụ, có thể chạy cục bộ trên máy tính hoặc từ xa trên hạ tầng đám mây.

Sơ đồ bộ ba Host, Client và Server: một Host chứa nhiều Client, mỗi Client giữ một kết nối riêng tới một Server cục bộ hoặc từ xa

Cơ chế quản lý Client bên trong một Host rất linh hoạt, nhưng đòi hỏi sự chặt chẽ về logic phiên làm việc. Một Host có thể duy trì nhiều Client đồng thời, mỗi Client là một phiên kết nối riêng biệt đến một Server cụ thể. Hãy lấy ví dụ về VS Code khi bạn đang code một dự án lớn: khi bạn kết nối với server Sentry để lấy log lỗi và đồng thời kết nối với server Filesystem để duyệt mã nguồn, VS Code sẽ thực thi hai đối tượng Client độc lập, trong đó Client thứ nhất quản lý luồng dữ liệu từ Sentry API, còn Client thứ hai xử lý các lời gọi hệ thống (system calls) để tương tác với tệp tin.

Sự tách biệt này đảm bảo rằng lỗi xảy ra ở một kết nối Server không làm sập toàn bộ ứng dụng Host, vì mỗi Client hoạt động như một tiến trình hoặc một luồng quản lý tài nguyên riêng biệt. Theo đặc tả phiên bản 2026-07-28, các Client đã chuyển hướng sang mô hình không lưu trạng thái (stateless) ở tầng lõi. Điều này có nghĩa là Host không còn phải duy trì những kho lưu phiên phức tạp hay cấu hình "sticky routing" (định tuyến cố định) khi triển khai trên các hạ tầng phân tán, bởi mọi yêu cầu từ Client đều mang theo đủ ngữ cảnh để Server có thể xử lý độc lập — một thay đổi mà bất kỳ ai từng vận hành MCP server ở quy mô thật đều sẽ thấy nhẹ người.

Sức mạnh của Client nằm ở khả năng tự động khám phá (discovery). Khi một Client được khởi tạo, nó không cần biết trước Server có những gì, vì thông qua phương thức server/discover, Client sẽ truy vấn Server về các khả năng (capabilities), phiên bản giao thức hỗ trợ và danh tính. Quá trình này giúp các hệ thống AI trở nên linh động: bạn chỉ cần cắm thêm một Server mới vào hệ thống, và Client sẽ tự động "học" được các công cụ mới mà không cần bạn phải viết lại một dòng code tích hợp nào trong Host.

Client làm gì trong một phiên kết nối?

Vòng đời của một kết nối bắt đầu bằng việc thiết lập lớp vận chuyển (transport layer), khi MCP Client phải quyết định sử dụng phương thức nào để gửi các gói tin JSON-RPC 2.0. Có hai loại chính: STDIO (Standard Input/Output, tức là đọc ghi thẳng qua luồng vào/ra của tiến trình) cho các server chạy cục bộ, và Streamable HTTP (truyền qua HTTP, dùng được cho server ở xa) cho các server từ xa. Với Streamable HTTP, Client sử dụng HTTP POST để gửi yêu cầu và lắng nghe luồng sự kiện đẩy từ máy chủ (Server-Sent Events, SSE) để nhận các phản hồi hoặc thông báo thời gian thực. Đặc biệt, phiên bản 2026 yêu cầu Client phải gửi kèm các header như Mcp-MethodMcp-Name để hạ tầng mạng (load balancer, gateway) có thể định tuyến mà không cần bóc tách thân tin nhắn.

Vòng đời một phiên kết nối MCP: khám phá năng lực, liệt kê công cụ, gọi công cụ và nhận thông báo, qua hai kiểu vận chuyển STDIO và Streamable HTTP

Khi kết nối đã thiết lập, Client thực hiện việc quản lý tài nguyên thông qua các cơ chế bất đồng bộ. Trong Python, bạn sẽ thường thấy khối lệnh async with, còn trong TypeScript là các hàm connect()close(). Việc sử dụng các khối quản lý tài nguyên này đảm bảo rằng khi phiên làm việc kết thúc, các tiến trình con của Server (đối với STDIO) hoặc các kết nối HTTP sẽ được đóng sạch sẽ. Nếu Client không quản lý tốt vòng đời này, hệ thống sẽ nhanh chóng rơi vào tình trạng cạn kiệt tài nguyên hoặc rò rỉ bộ nhớ khi số lượng server kết nối tăng lên.

Dữ liệu trao đổi giữa Client và Server tuân thủ chặt chẽ định dạng JSON-RPC 2.0, và điểm mấu chốt trong phiên bản 2026-07-28 là tính chất stateless thông qua trường _meta. Mọi yêu cầu từ Client đều phải chứa _meta, bao gồm io.modelcontextprotocol/protocolVersionclientCapabilities. Nếu Server không hỗ trợ phiên bản Client yêu cầu, nó sẽ trả về lỗi UnsupportedProtocolVersionError, buộc Client phải thực hiện một bước hạ cấp (fallback) về phiên bản cũ hơn nếu có thể, và nhờ vậy hệ thống luôn tương thích ngược trong một môi trường có nhiều phiên bản Server khác nhau.

Dưới đây là một ví dụ thực tế về yêu cầu thực thi công cụ tools/call từ Client, tuân thủ đúng đặc tả kỹ thuật 2026:

json
{
  "jsonrpc": "2.0",
  "id": 3,
  "method": "tools/call",
  "params": {
    "name": "weather_current",
    "arguments": {
      "location": "San Francisco",
      "units": "imperial"
    },
    "_meta": {
      "io.modelcontextprotocol/protocolVersion": "2026-07-28",
      "io.modelcontextprotocol/clientInfo": {
        "name": "enterprise-client",
        "version": "1.0.0"
      },
      "io.modelcontextprotocol/clientCapabilities": {
        "elicitation": {}
      }
    }
  }
}

Sau khi gửi yêu cầu, Client sẽ nhận được kết quả với trường resultType bắt buộc, trong đó giá trị có thể là complete cho kết quả cuối cùng hoặc input_required cho các quy trình cần thêm bước phản hồi. Việc chuẩn hóa kết quả thành mảng content cho phép Client xử lý được nhiều loại dữ liệu trả về cùng lúc như văn bản, hình ảnh hoặc tài nguyên liên kết, và điều đó tạo tiền đề cho các phản hồi đa phương thức từ AI.

Elicitation, sampling và roots: những gì client cung cấp cho server

Kiến trúc MCP không phải là đường một chiều, bởi MCP Client cũng cung cấp các nguyên mẫu (primitives) để Server có thể gọi ngược lại. Đây là chìa khóa để tạo ra các tác nhân AI biết chủ động hỏi lại thay vì chỉ ngồi đợi lệnh.

Ba khả năng Client cung cấp cho Server đặt cạnh nhau: Elicitation hỏi thêm thông tin, Sampling mượn mô hình của Client, Roots giới hạn thư mục truy cập

Elicitation (gợi mở) là cơ chế cho phép Server yêu cầu thêm thông tin từ người dùng thông qua Client. Khi Server nhận thấy một tham số còn thiếu hoặc cần xác nhận của con người cho một hành động nhạy cảm, nó sẽ gửi yêu cầu elicitation/create, và Client sẽ hiển thị giao diện phù hợp (một biểu mẫu, hoặc một URL mở ra ngoài cho các luồng nhạy cảm như đăng nhập OAuth) rồi trả kết quả về. Quy trình này sử dụng mô hình yêu cầu đa vòng (Multi Round-Trip Requests, MRTR), trong đó Client phải gửi kèm một requestState (một chuỗi mờ) do Server cung cấp để Server có thể khôi phục trạng thái xử lý mà không cần lưu trữ phiên trên bộ nhớ.

Sampling (lấy mẫu) cho phép Server yêu cầu Client thực hiện một lượt gọi LLM. Ví dụ, một Server xử lý dữ liệu database có thể yêu cầu tóm tắt một bảng dữ liệu trước khi gửi kết quả cuối cùng. Điểm lợi hại nhất ở đây là Server không bao giờ nhìn thấy khóa API của mô hình, vì Client hoàn toàn kiểm soát việc chọn model (thông qua modelPreferences), giới hạn token và bảo mật, còn Server chỉ nhận được kết quả cuối cùng. Tuy nhiên, tính năng này hiện đã bị đánh dấu lỗi thời (deprecated), với hướng thay thế là Server tích hợp thẳng với API của nhà cung cấp model.

Roots (gốc) là danh sách các thư mục hoặc tệp tin mà Client cho phép Server truy cập, và thông qua Roots, Client thiết lập một ranh giới làm việc rõ ràng. Thay vì cho phép Server lục lọi toàn bộ ổ cứng, Client chỉ định danh sách các đường dẫn hợp lệ, còn Server truy vấn danh sách này qua lệnh roots/list. Cần nói rõ một điều mà đặc tả cũng nói rõ: Roots là cơ chế phối hợp chứ không phải hàng rào bảo mật, bởi đặc tả chỉ yêu cầu Server "nên" tôn trọng ranh giới đó chứ không bắt buộc, vì Server chạy mã mà Client không kiểm soát được. An ninh thật sự vẫn phải đến từ quyền hệ điều hành và sandbox.

Cơ chế MRTR trong các tính năng này là minh chứng rõ nhất cho tư duy thiết kế hệ thống phân tán của MCP. Bằng cách đẩy trạng thái vào luồng dữ liệu truyền tải, MCP cho phép bất kỳ Server nào trong một cụm cũng có thể tiếp tục xử lý công việc từ vòng đàm phán trước đó, nhờ đó các hệ thống tác nhân có khả năng chịu lỗi cao hơn hẳn mô hình giữ kết nối mở.

Vì sao roots và sampling bị deprecated nhưng vẫn còn dùng?

Kể từ đặc tả SEP-2596 và phiên bản 2026-07-28, các tính năng Sampling, Roots và Logging đã chính thức chuyển sang trạng thái lỗi thời (deprecated). Trong vòng đời tính năng của MCP, một tính năng bị deprecated không bị xóa bỏ ngay lập tức mà bắt đầu một giai đoạn chuyển đổi kéo dài tối thiểu 12 tháng. Cụ thể, chúng chỉ đủ điều kiện gỡ bỏ ở bản đặc tả đầu tiên phát hành từ ngày 28/07/2027 trở đi, và thời điểm gỡ thật sự vẫn là quyết định của nhóm bảo trì.

Dòng thời gian ngừng hỗ trợ Roots và Sampling: đánh dấu lỗi thời ở bản 2026-07-28, giữ tối thiểu 12 tháng, sớm nhất được gỡ từ 28/07/2027

Lý do đằng sau việc deprecated Sampling là sự thay đổi trong triết lý kiến trúc. Việc bắc cầu lời gọi LLM qua Client làm tăng độ phức tạp không cần thiết, nên các Server hiện đại được khuyến khích tích hợp trực tiếp với API của nhà cung cấp mô hình. Đối với Roots, việc duy trì một danh sách quyền tĩnh tỏ ra kém linh hoạt so với việc truyền tham số đường dẫn trực tiếp qua công cụ (tools), qua URI tài nguyên hoặc qua cấu hình Server, và cách tiếp cận mới giúp việc cấp quyền trở nên rõ ràng hơn vì nó gắn liền với từng tác vụ cụ thể thay vì cấp quyền diện rộng.

Dù bị deprecated, các tính năng này vẫn còn được sử dụng rộng rãi vì tính tương thích ngược. Rất nhiều Server đã được xây dựng dựa trên đặc tả 2025 và không thể nâng cấp trong một đêm, nên Client phiên bản 2026 vẫn hỗ trợ các tính năng này để đảm bảo rằng các hệ thống hiện tại không bị hỏng. Tuy nhiên, nếu bạn đang bắt đầu một dự án mới hoặc thiết kế lại hệ thống, hãy tránh phụ thuộc cứng vào Roots và Sampling.

Việc hiểu rõ vòng đời này giúp bạn lập kế hoạch di trú mã nguồn sớm. Quy tắc 12 tháng cung cấp đủ thời gian để các kỹ sư cập nhật code, chuyển đổi các lời gọi Sampling sang API trực tiếp và thay thế Roots bằng cơ chế tham số hóa, miễn là bạn không để công việc đó dồn đến sát hạn, bởi những đợt di trú kiểu này luôn phát sinh nhiều việc hơn con số ước tính ban đầu.

Những ứng dụng nào đang là MCP client?

Hệ sinh thái MCP đang bùng nổ với sự tham gia của các tên tuổi lớn, và những ứng dụng AI hàng đầu hiện nay đều đã tích hợp MCP Client để mở rộng khả năng. Có thể kể đến Claude Desktop của Anthropic, Cursor, ChatGPT của OpenAI, và VS Code của Microsoft. Thậm chí các trình soạn thảo mã nguồn mới như Zed hay Windsurf cũng đã đưa hỗ trợ MCP vào lõi ứng dụng để cạnh tranh về khả năng tích hợp công cụ.

Sự phát triển này được thúc đẩy bởi quyết định chiến lược của Anthropic khi đóng góp MCP cho Agentic AI Foundation thuộc Linux Foundation vào tháng 12/2025. Việc đưa MCP trở thành một tiêu chuẩn trung lập, được sự ủng hộ của AWS, Google, Microsoft và Cloudflare, đã tạo ra một "thị trường chung" cho các công cụ AI. Khi một ứng dụng trở thành Client, nó ngay lập tức có quyền truy cập vào gần 2.000 mục trong MCP Registry, từ các công cụ quản lý hạ tầng như Sentry, Kubernetes cho đến các công cụ năng suất như Slack, Google Drive.

Con số ấy vừa nói lên độ phủ, vừa nói lên chi phí vận hành. Cơ chế Code Mode của Cloudflare (cho tác nhân viết mã gọi công cụ thay vì nạp sẵn mọi định nghĩa) cho thấy việc để tác nhân khám phá và gọi công cụ tuần tiến, thay vì nạp toàn bộ định nghĩa công cụ vào prompt ngay từ đầu, có thể tiết kiệm hơn 98% lượng token. Với một Client phải liên kết hàng chục Server cùng lúc, đó là khác biệt giữa một hệ thống dùng được và một hệ thống tiêu hết cửa sổ ngữ cảnh trước khi kịp làm việc gì.

Điều đáng chú ý là hệ sinh thái này vẫn còn một khoảng trống lớn, bởi cấu hình không chuyển được giữa các Client. Thiết lập một Server trong ứng dụng này rồi chuyển sang ứng dụng khác đồng nghĩa với việc làm lại từ đầu, vì chưa có chuẩn chung nào cho phần cấu hình. Đó là cái giá của một hệ sinh thái trẻ đang mở rộng nhanh hơn tốc độ chuẩn hóa, và bạn nên tính nó vào chi phí trước khi cam kết với một Client cụ thể.

Vì sao client là chốt kiểm soát bảo mật?

Trong mô hình MCP, MCP Client giữ vị trí người gác cổng, và đây vừa là điểm nhạy cảm nhất vừa là điểm quan trọng nhất trong hạ tầng an ninh. Vì Server là các tiến trình ngoại vi hoặc dịch vụ từ xa có thể bị chiếm quyền, Client là thực thể duy nhất có quyền quyết định cuối cùng về việc cho phép Server làm gì. Client không bao giờ tin tưởng tuyệt đối vào Server, mà luôn thực hiện kiểm tra chéo dựa trên cấu hình của người dùng.

Client là chốt kiểm soát bảo mật, chặn ba hướng tấn công: trộm tài nguyên, chiếm quyền hội thoại và gọi công cụ ngầm

Để bảo vệ các kết nối từ xa, Client dựa trên nền tảng ủy quyền OAuth của giao thức. Đặc tả 2026-07-28 cũng siết lại phần danh tính, khi cơ chế đăng ký client động (Dynamic Client Registration) đã bị đánh dấu lỗi thời và được thay bằng Client ID Metadata Documents, tức là một URL trỏ tới tài liệu JSON do chính Client kiểm soát. Cách làm này cho phép liên kết động mà không cần một cơ sở dữ liệu đăng ký có sẵn từ trước.

Nghiên cứu an ninh về vector tấn công qua Sampling đã chỉ ra ba mối đe dọa mà Client phải ngăn chặn:

  1. Trộm tài nguyên (resource theft): Server độc hại gửi các yêu cầu sampling ẩn chứa chỉ thị ngầm, khiến mô hình sinh ra nội dung không ai yêu cầu và đốt token của người dùng, trong khi giao diện chỉ hiển thị phần kết quả tóm tắt.
  2. Chiếm quyền hội thoại (conversation hijacking): Server tiêm các chỉ thị bền vào phản hồi, làm thay đổi hành vi của mô hình ở những lượt sau. Nhóm nghiên cứu đã chứng minh điều này bằng cách khiến trợ lý lập trình chuyển sang nói giọng cướp biển sau lần xâm nhập đầu tiên.
  3. Gọi công cụ ngầm (covert tool invocation): Chỉ thị ẩn đánh lừa mô hình gọi thêm công cụ mà người dùng không hề cho phép, dẫn tới ghi tệp trái phép hoặc các thao tác hệ thống khác.

Giải pháp then chốt là nguyên tắc giữ con người trong vòng quyết định (human-in-the-loop). Mọi yêu cầu nhạy cảm từ Server đều phải được Client hiển thị rõ ràng để bạn phê duyệt, kèm theo việc làm sạch các yêu cầu do Server khởi tạo, lọc những cụm từ mang dáng dấp chỉ thị trong kết quả trả về, và giới hạn tần suất sampling. Client vì thế là lớp tường lửa cuối cùng, và nếu nó làm đúng việc của mình thì ngay cả khi Server bị chiếm quyền, thiệt hại cũng dừng lại ở đó chứ không lan vào hệ thống của bạn.

Khi nào bạn cần tự viết một MCP client?

Với phần lớn người đọc thì câu trả lời là không cần, bởi các Client có sẵn như Claude Desktop, Cursor hay VS Code đã đủ trưởng thành, nhưng vẫn có những tình huống bạn buộc phải tự tay xây dựng một MCP Client. Đó là khi bạn phát triển các ứng dụng AI tùy chỉnh cho doanh nghiệp, nơi yêu cầu sự tích hợp sâu vào quy trình nghiệp vụ đặc thù, một lớp giao diện riêng, hoặc cần tuân thủ các quy định bảo mật khắt khe mà các ứng dụng thương mại không thể đáp ứng.

Khi tự viết Client, bạn nên tận dụng các SDK chính thức để giảm thiểu rủi ro triển khai sai giao thức: Python và TypeScript là hai ngôn ngữ có SDK chính thức, còn Java, Kotlin, C#, Go, Rust và Swift hiện do cộng đồng duy trì. Một lợi thế lớn của việc tự viết Client dựa trên đặc tả 2026 là khả năng mở rộng ngang, bởi nhờ tính chất stateless của giao thức, bạn có thể chạy nhiều instance của Client mà không cần lo lắng về việc duy trì phiên cố định.

Tài liệu tham khảo

Chia sẻ bài viết

X / TwitterFacebookLinkedIn