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

Implementing a client

📖 Nội dung bài học

Tóm tắt

Bây giờ chúng ta đã có server MCP hoạt động, đã đến lúc xây dựng phía client. Client là thứ cho phép ứng dụng của chúng ta giao tiếp với server MCP và truy cập chức năng của nó.

Hiểu kiến trúc Client

Trước khi đi sâu vào code, hãy làm rõ một điểm quan trọng về các dự án MCP. Thông thường, bạn sẽ triển khai hoặc là client MCP hoặc là server MCP - không phải cả hai. Chúng ta đang xây dựng cả hai trong dự án này chỉ để bạn có thể thấy cách chúng hoạt động cùng nhau.

Client MCP bao gồm hai thành phần chính hoạt động cùng nhau:

  • MCP Client - Một lớp tùy chỉnh chúng ta tạo ra để sử dụng session dễ dàng hơn
  • Client Session - Kết nối thực tế với server (là một phần của MCP Python SDK)

Client session xử lý giao tiếp cấp thấp nhưng yêu cầu dọn dẹp tài nguyên cẩn thận khi chương trình của bạn kết thúc. Đó là lý do tại sao chúng ta bọc nó trong lớp của riêng mình - để quản lý việc dọn dẹp đó một cách tự động.

Client phù hợp với ứng dụng của chúng ta như thế nào

Nhớ lại sơ đồ luồng ứng dụng của chúng ta? Client đóng vai trò quan trọng trong hai thời điểm chính:

Code CLI của chúng ta sử dụng client để:

  • Lấy danh sách các tool có sẵn để gửi đến Claude
  • Thực thi các tool khi Claude yêu cầu chúng

Triển khai các hàm Client cốt lõi

Hãy triển khai hai hàm thiết yếu: list_toolscall_tool.

Đối với list_tools, chúng ta cần kết nối với session của mình và yêu cầu các tool có sẵn:

async def list_tools(self) -> list[types.Tool]:
    result = await self.session().list_tools()
    return result.tools

Đối với call_tool, chúng ta truyền tên tool và các tham số đầu vào cho 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ỉ vậy thôi! Session xử lý tất cả các chi tiết giao tiếp phức tạp cho chúng ta.

Kiểm thử Client

File client bao gồm một bộ công cụ kiểm thử đơn giản ở cuối. Bạn có thể chạy trực tiếp để xác minh mọi thứ hoạt động:

uv run mcp_client.py

Thao tác này sẽ kết nối với server MCP của bạn và in ra các tool có sẵn. Bạn sẽ thấy kết quả hiển thị định nghĩa tool của mình, bao gồm tên, mô tả và lược đồ đầu vào.

Sự khác biệt quan trọng về Schema

Đây là một điểm cần lưu ý: định nghĩa tool MCP không hoàn toàn khớp với những gì Claude mong đợi. Đặc tả MCP có định dạng riêng cho các lược đồ tool, hơi khác so với những gì Bedrock yêu cầu.

Đừng lo lắng - đã có code trong dự án xử lý việc chuyển đổi này một cách tự động. Hàm to_bedrock_tools trong core/bedrock.py dịch các định nghĩa tool MCP sang định dạng mà Claude hiểu.

Kiểm thử với Claude

Bây giờ cả server và client đều hoạt động, bạn có thể kiểm thử luồng hoàn chỉnh. Hãy thử chạy ứng dụng chính của bạn và yêu cầu Claude đọc một tài liệu:

uv run main.py

Sau đó hỏi: "What is the contents of the report.pdf document?" (Nội dung của tài liệu report.pdf là gì?)

Claude sẽ:

  1. Nhận danh sách các tool có sẵn từ client của bạn
  2. Quyết định sử dụng tool read_doc_contents
  3. Client của bạn sẽ thực thi tool đó trên server MCP
  4. Claude sẽ nhận được nội dung tài liệu và phản hồi

1. client.list_tools từ MCP server

to_bedrock_tools — MCP schema → Bedrock format

2. Gửi tools + user query → Bedrock Converse

3. Claude chọn tool — client.call_tool trên MCP

4. Result → Claude → user

Client đóng vai trò là cầu nối giữa code ứng dụng của bạn và server MCP, giúp dễ dàng hiển thị chức năng của server cho Claude và các phần khác trong hệ thống của bạn.

🔁 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?