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

Roots walkthrough

📖 Nội dung bài học

  1. Định nghĩa roots

Lý tưởng nhất, người dùng sẽ chỉ định các file/folder nào có thể truy cập bởi server MCP.

Chương trình này được thiết lập để chấp nhận một danh sách các đối số CLI, được hiểu là các đường dẫn mà người dùng muốn cho phép truy cập.

Danh sách các đường dẫn đó được cung cấp cho MCPClient ở dòng 42.

  1. Tạo đối tượng root

Theo đặc tả MCP, tất cả các roots phải có URI bắt đầu bằng file://.

Hàm này lấy danh sách các đường dẫn do người dùng cung cấp và biến chúng thành các đối tượng Root.

  1. Callback Roots

Client không cung cấp ngay lập tức danh sách roots cho server. Thay vào đó, server có thể yêu cầu client tại một thời điểm trong tương lai. Bạn tạo một callback sẽ được thực thi khi server yêu cầu roots. Callback cần trả về danh sách roots bên trong một đối tượng ListRootsResult.

Callback này được truyền vào ClientSession ở dòng 58.

  1. Sử dụng roots

Tiếp theo là server. Server sẽ dùng roots trong hai trường hợp:

  1. Bất cứ khi nào một tool cố gắng truy cập một file hoặc folder
  2. Khi một LLM (như Claude) cần giải quyết một file hoặc folder thành một đường dẫn đầy đủ. Hãy nghĩ đến khi người dùng nói 'đọc file todos.txt' - Claude cần tìm ra file text nằm ở đâu, và có thể làm như vậy bằng cách xem danh sách roots

Để xử lý trường hợp thứ hai, bạn có thể định nghĩa một tool liệt kê các roots hoặc chèn chúng trực tiếp vào một prompt.

  1. Truy cập roots

Bạn truy cập roots bằng cách gọi ctx.session.list_roots().

Thao tác này gửi một message trở lại client, khiến nó chạy callback liệt kê root.

  1. Ủy quyền truy cập

Hãy nhớ: SDK MCP không cố gắng giới hạn những file hoặc folder nào mà các tool của bạn cố gắng đọc! Bạn phải tự triển khai việc kiểm tra đó.

Hãy xem xét việc triển khai một hàm như is_path_allowed, hàm này sẽ quyết định xem một đường dẫn có thể truy cập được hay không bằng cách so sánh nó với danh sách roots.

  1. Ủy quyền truy cập

Khi bạn đã tạo một hàm ủy quyền - như is_path_allowed - hãy dùng nó trong suốt các tool của bạn để đảm bảo đường dẫn được yêu cầu có thể truy cập được.

← Previous Next →

Files

📂 core

📄 __init__.py

📄 chat.py

📄 claude.py

📄 cli_chat.py

📄 cli.py

📄 tools.py

📄 utils.py

📄 video_converter.py

📄 .env.example

📄 .gitignore

📄 main.py

📄 mcp_client.py

📄 mcp_server.py

📄 pyproject.toml

📄 README.md

main.py×

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

assert claude_model, "Error: 

CLAUDE_MODEL cannot be empty. Update .

env"

assert anthropic_api_key, (

    "Error: ANTHROPIC_API_KEY cannot 

    be empty. Update .env"

)

async def main():

    claude_service = Claude

    (model=claude_model)

    # Get root directories from 

    command line arguments

    root_paths = sys.argv[1:]

    if not root_paths:

        print("Usage: uv run main.py 

         [root2] ...")

        print("Example: uv run main.

        py /path/to/videos /another/

        path")

        sys.exit(1)

    clients = {}

    async with AsyncExitStack() as 

    stack:

        # Create the MCP client with 

        the provided root directories

        doc_client = await stack.

        enter_async_context(

Summary

Downloads

Tutorial Steps

Bạn hãy xem xét kỹ hơn cách triển khai tính năng này bằng cách xem xét một project mẫu.

Skip Next

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