MCP Client là gì? Kết nối Python với MCP Server

B3c8b07e-94ec-400e-b6df-36ef0e9f97de

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

  1. Client khởi tạo kết nối với MCP Server.
  2. 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ợ.
  3. Client yêu cầu danh sách tools hoặc các khả năng khác mà server công bố.
  4. Ứng dụng lựa chọn tool phù hợp và gửi tên tool cùng tham số.
  5. Server thực thi tool và trả kết quả.
  6. 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:

  1. Ứng dụng lấy danh sách tool từ MCP Server.
  2. Các mô tả và schema tool được chuyển thành thông tin mà mô hình có thể sử dụng.
  3. Mô hình phân tích yêu cầu người dùng và đề xuất tool phù hợp.
  4. Host kiểm tra quyết định, quyền truy cập và tham số trước khi thực thi.
  5. 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

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:

→ Chỉ mục