📖 Nội dung bài học
Tóm tắt
Sau khi đã có MCP server hoạt động, giờ là lúc chúng ta xây dựng phía client. Client là thành phần cho phép ứng dụng giao tiếp với MCP server và truy cập vào các chức năng của nó.
Hiểu về kiến trúc Client
Trong hầu hết các dự án thực tế, bạn sẽ triển khai hoặc một MCP client HOẶC một MCP server - chứ không phải cả hai. Chúng ta đang xây dựng cả hai trong dự án này để bạn có thể thấy cách chúng phối hợp với nhau.

MCP client bao gồm hai thành phần chính:
- MCP Client - Một class tùy chỉnh chúng ta tạo ra để việc sử dụng session dễ dàng hơn.
- Client Session - Kết nối thực tế đến server (thuộc MCP Python SDK).

Client session yêu cầu dọn dẹp tài nguyên (resource cleanup) đúng cách sau khi sử dụng xong. Đó là lý do tại sao chúng ta bao bọc nó trong class MCP Client tùy chỉnh - để xử lý việc dọn dẹp đó một cách tự động.
Cách Client khớp vào ứng dụng
Bạn còn nhớ luồng hoạt động của ứng dụng không? Mã CLI của chúng ta cần thực hiện hai việc chính với MCP server:

- Lấy danh sách các tool có sẵn để gửi cho Claude.
- Thực thi các tool khi Claude yêu cầu.
MCP client cung cấp các khả năng này thông qua các phương thức gọi đơn giản mà mã ứng dụng có thể sử dụng.
Triển khai các phương thức cốt lõi
Chúng ta cần triển khai hai phương thức chính trong client: list_tools() và call_tool().
Phương thức List Tools
Phương thức này lấy tất cả các tool có sẵn từ server:
async def list_tools(self) -> list[types.Tool]:
result = await self.session().list_tools()
return result.tools
Nó khá đơn giản - chúng ta truy cập vào session (kết nối tới server), gọi hàm list_tools() có sẵn và trả về các tool từ kết quả nhận được.
Phương thức Call Tool
Phương thức này thực thi một tool cụ thể trên server:
async def call_tool(
self, tool_name: str, tool_input: dict
) -> types.CallToolResult | None:
return await self.session().call_tool(tool_name, tool_input)
Chúng ta truyền tên tool và các tham số đầu vào (do Claude cung cấp) cho server và trả về kết quả.
Kiểm thử Client
Để kiểm tra việc triển khai, chúng ta có thể chạy trực tiếp client. File này bao gồm một bộ khung kiểm thử (testing harness) giúp kết nối với MCP server và gọi các phương thức của chúng ta:
async with MCPClient(
command="uv", args=["run", "mcp_server.py"]
) as client:
result = await client.list_tools()
print(result)
Khi chạy thử nghiệm này, bạn sẽ thấy các định nghĩa tool được in ra, bao gồm các tool read_doc_contents và edit_document mà chúng ta đã tạo trước đó.
Tổng kết lại
Giờ đây, khi client đã có thể liệt kê và gọi các tool, chúng ta có thể kiểm tra toàn bộ luồng hoạt động. Khi chạy ứng dụng chính và hỏi Claude về một tài liệu:
- Mã của chúng ta sử dụng client để lấy các tool có sẵn.
- Các tool này được gửi đến Claude cùng với câu hỏi của người dùng.
- Claude quyết định sử dụng tool
read_doc_contents. - Mã của chúng ta sử dụng client để thực thi tool đó.
- Kết quả được gửi ngược lại cho Claude, sau đó Claude sẽ phản hồi cho người dùng.
Ví dụ, khi hỏi "Nội dung của tài liệu report.pdf là gì?", Claude sẽ kích hoạt tool đọc tài liệu của chúng ta, và chúng ta sẽ nhận được thông tin về tài liệu "20m condenser tower" mà chúng ta đã thiết lập trong server.
Client đóng vai trò là cầu nối giữa logic ứng dụng và MCP server, giúp việc truy cập các chức năng của server trở nên dễ dàng mà không cần lo lắng về các chi tiết kết nối bên dưới.
🔁 Bài học liên quan
- Bài tiếp: Defining resources
- Bài trước: The server inspector
- Cùng section: Making a request · Multi-Turn conversations · Chat exercise
- Thuộc lộ trình: Path C
- Docs tham khảo: Glossary · Skills atlas · By use-case
📚 Nguồn & ghi nhận
- Bài học gốc Anthropic Academy: https://anthropic.skilljar.com/claude-with-the-anthropic-api/287793
- © 2025 Anthropic. Chỉ dùng cho mục đích giáo dục, fair-use.
- Crawl: 2026-04-23 · Chuẩn hoá: 2026-05-01