📖 Nội dung bài học
- Đị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.
- 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.
- 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.
- Sử dụng roots
Tiếp theo là server. Server sẽ dùng roots trong hai trường hợp:
- Bất cứ khi nào một tool cố gắng truy cập một file hoặc folder
- 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.
- 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.
- Ủ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.
- Ủ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
- Bài tiếp: Survey
- Bài trước: Roots
- Cùng section: Survey
- Thuộc lộ trình: Path D
- 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/model-context-protocol-advanced-topics/295839
- © 2025 Anthropic. Chỉ dùng cho mục đích giáo dục, fair-use.
- Crawl: — · Chuẩn hoá: 2026-05-01