Ở bài viết trước, chúng ta đã xây dựng một MCP Server bằng Python để cung cấp công cụ tra cứu khóa học. Nhưng một server chỉ là một phía của hệ thống. Làm thế nào để một ứng dụng khác kết nối tới server, biết những công cụ nào đang có và yêu cầu thực thi một công cụ cụ thể?
Câu trả lời là MCP Client. Trong bài viết này, chúng ta sẽ tìm hiểu vai trò của MCP Client và xây dựng một client bằng Python để khám phá và gọi tool từ MCP Server.
1. MCP Client là gì?
MCP Client là thành phần giao tiếp với MCP Server theo Model Context Protocol (MCP). Client gửi các yêu cầu theo giao thức, chẳng hạn liệt kê tools, gọi tool hoặc đọc resource, rồi nhận kết quả từ server.
Trong ứng dụng AI, MCP Client thường nằm bên trong MCP Host. Host là ứng dụng mà người dùng tương tác, còn client đảm nhiệm phần giao tiếp với server.
2. Phân biệt MCP Host, Client và Server
| Thành phần | Vai trò | Ví dụ |
|---|---|---|
| MCP Host | Ứng dụng AI điều phối mô hình, giao diện và các kết nối. | Ứng dụng trợ lý AI. |
| MCP Client | Giao tiếp với một MCP Server thông qua giao thức MCP. | Khám phá tools và gửi yêu cầu gọi tool. |
| MCP Server | Công bố tools, resources hoặc prompts. | Server cung cấp công cụ tìm kiếm khóa học. |
Một host có thể quản lý nhiều client, mỗi client kết nối với một server. MCP Client không phải là mô hình ngôn ngữ; nó là thành phần giao tiếp giữa ứng dụng và server.
3. MCP Client hoạt động như thế nào?
- Client khởi tạo kết nối với MCP Server.
- Hai bên thực hiện bước khởi tạo và thống nhất các khả năng hỗ trợ.
- Client yêu cầu danh sách tools hoặc các khả năng khác mà server công bố.
- Ứng dụng lựa chọn tool phù hợp và gửi tên tool cùng tham số.
- Server thực thi tool và trả kết quả.
- Client chuyển kết quả về cho ứng dụng để hiển thị hoặc tiếp tục xử lý.
Quy trình trên được thực hiện theo giao thức MCP. Client không cần tự xây dựng toàn bộ cơ chế đóng gói thông điệp hay xử lý JSON-RPC khi sử dụng SDK.
4. Chuẩn bị môi trường Python
Bài thực hành sử dụng MCP Python SDK v2. Tài liệu hiện hành yêu cầu Python 3.11 trở lên.
uv init mcp-client-demo
cd mcp-client-demo
uv add "mcp[cli]"
Nếu dùng pip trong môi trường ảo đã kích hoạt:
pip install "mcp[cli]"
SDK này cung cấp cả khả năng tạo server và xây dựng client. Nên sử dụng cùng một môi trường dự án để tránh xung đột phiên bản thư viện.
5. Kết nối Python Client với MCP Server qua stdio
Trong ví dụ này, giả sử bạn đã có file server.py từ bài viết trước, trong đó MCP Server đăng ký tool search_courses(keyword).
Phương thức stdio cho phép client khởi chạy server dưới dạng một tiến trình con và giao tiếp qua luồng đầu vào, đầu ra chuẩn. Đây là cách thường dùng cho server cục bộ.
Tạo file client.py:
import asyncio
from mcp import Client, StdioServerParameters
async def main():
server = StdioServerParameters(
command="uv",
args=[
"run",
"mcp",
"run",
"server.py",
"--transport",
"stdio"
]
)
async with Client(server) as client:
tools = await client.list_tools()
print("Available tools:")
for tool in tools.tools:
print(tool.name, "-", tool.description)
result = await client.call_tool(
"search_courses",
{"keyword": "Python"}
)
print("Tool result:")
print(result.content)
if __name__ == "__main__":
asyncio.run(main())
6. Giải thích code từng bước
6.1. Khai báo server cần kết nối
server = StdioServerParameters(
command="uv",
args=[
"run",
"mcp",
"run",
"server.py",
"--transport",
"stdio"
]
)
StdioServerParameters mô tả cách khởi chạy tiến trình server: lệnh thực thi, các tham số và môi trường nếu cần. Ví dụ sử dụng CLI của SDK để chạy file server qua stdio.
Nếu dự án của bạn chạy server bằng một lệnh khác, hãy thay đổi command và args tương ứng. Đường dẫn file cũng phải đúng với thư mục làm việc.
6.2. Mở kết nối
async with Client(server) as client:
Client kết nối khi bước vào khối async with và tự quản lý vòng đời kết nối khi rời khỏi khối. Vì SDK sử dụng API bất đồng bộ, chương trình cần chạy trong một hàm async.
6.3. Khám phá tools
tools = await client.list_tools()
for tool in tools.tools:
print(tool.name, "-", tool.description)
Lệnh list_tools() yêu cầu server trả về danh sách công cụ mà server công bố. Client có thể đọc tên, mô tả và schema đầu vào để biết những công cụ nào có thể được sử dụng.
6.4. Gọi một tool
result = await client.call_tool(
"search_courses",
{"keyword": "Python"}
)
Client gửi tên tool cùng tham số đầu vào. Server sẽ thực thi hàm tương ứng nếu yêu cầu hợp lệ và trả kết quả về cho client.
Ví dụ này gọi tool trực tiếp bằng code Python. Nó chưa sử dụng LLM để tự lựa chọn công cụ.
7. Chạy chương trình và kiểm tra kết quả
Đảm bảo file server.py tồn tại, tool search_courses đã được đăng ký và lệnh khởi chạy server phù hợp với phiên bản SDK đã cài. Sau đó chạy:
uv run python client.py
Nếu cấu hình đúng, client sẽ in danh sách tools, sau đó hiển thị kết quả tìm kiếm khóa học theo từ khóa Python. Kết quả cụ thể phụ thuộc vào dữ liệu mà server đang sử dụng.
Nếu server không khởi chạy, hãy kiểm tra đường dẫn file, lệnh CLI, phiên bản SDK và các thông báo lỗi ở terminal.
8. Kết nối với MCP Server qua HTTP
Nếu MCP Server đã được triển khai qua Streamable HTTP, client có thể kết nối bằng URL thay vì khởi chạy tiến trình cục bộ.
import asyncio
from mcp import Client
async def main():
async with Client("http://localhost:8000/mcp") as client:
tools = await client.list_tools()
for tool in tools.tools:
print(tool.name)
result = await client.call_tool(
"search_courses",
{"keyword": "Python"}
)
print(result.content)
if __name__ == "__main__":
asyncio.run(main())
Trong ví dụ này, server phải đang chạy và phục vụ MCP tại đúng endpoint. URL minh họa http://localhost:8000/mcp cần được thay đổi nếu cấu hình server của bạn khác.
Streamable HTTP thường phù hợp khi client cần kết nối tới một server qua mạng. Với môi trường triển khai thực tế, cần cấu hình HTTPS, xác thực và phân quyền phù hợp.
9. Gọi tool trực tiếp khác gì để AI Agent chọn tool?
Trong ví dụ Python phía trên, chương trình đã biết trước tên tool search_courses và chủ động gọi nó. Đây là cách phù hợp để kiểm thử hoặc thực hiện một quy trình cố định.
Trong một AI Agent, luồng xử lý thường phức tạp hơn:
- Ứng dụng lấy danh sách tool từ MCP Server.
- Các mô tả và schema tool được chuyển thành thông tin mà mô hình có thể sử dụng.
- Mô hình phân tích yêu cầu người dùng và đề xuất tool phù hợp.
- Host kiểm tra quyết định, quyền truy cập và tham số trước khi thực thi.
- MCP Client gọi tool, sau đó kết quả được đưa trở lại quá trình xử lý của mô hình.
MCP không tự cung cấp khả năng suy luận của LLM. Việc lựa chọn tool phụ thuộc vào mô hình và logic điều phối của host; việc thực thi thông qua MCP Client.
10. Những lỗi thường gặp khi xây dựng MCP Client
- Không tìm thấy lệnh chạy server: kiểm tra
uv, Python, CLI và môi trường ảo. - Sai đường dẫn server: bảo đảm file server nằm đúng vị trí mà tiến trình con sử dụng.
- Không tìm thấy tool: kiểm tra tên tool, quá trình đăng ký và kết quả từ
list_tools(). - Sai tham số: tên và kiểu dữ liệu đầu vào phải khớp với schema của tool.
- Trộn phiên bản SDK: ví dụ v1 và v2 có thể sử dụng API khác nhau. Hãy theo đúng tài liệu của phiên bản đang cài.
- Không kiểm soát quyền: không nên cho phép gọi công cụ nhạy cảm mà không có xác thực, phân quyền và kiểm tra đầu vào.
11. Kết luận
MCP Client là thành phần giúp ứng dụng giao tiếp với MCP Server theo một giao thức thống nhất. Với Python MCP SDK, bạn có thể kết nối qua stdio hoặc Streamable HTTP, khám phá các tool được cung cấp và gọi chúng bằng những lời gọi hàm rõ ràng.
Đây là nền tảng quan trọng để phát triển ứng dụng AI có khả năng sử dụng công cụ. Bước tiếp theo là tích hợp MCP Client vào một AI Agent để mô hình có thể lựa chọn công cụ phù hợp theo yêu cầu người dùng, đồng thời vẫn duy trì kiểm soát về quyền truy cập và an toàn.
Tài liệu tham khảo
- MCP Python SDK – Official Documentation
- MCP Python SDK – Client Transports
- Model Context Protocol – Official Documentation
Tìm hiểu thêm về Data và AI tại MCNA
Nếu bạn muốn xây dựng nền tảng Python, phân tích dữ liệu và tìm hiểu cách ứng dụng AI vào các bài toán thực tế, hãy tham khảo các chương trình học tại MCNA Technology School:

