tthhanh commited on
Commit
2ffacfa
·
1 Parent(s): 8a42f02

feat: add toctree and translation unit 1 2

Browse files
units/vi/_toctree.yml ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ - title: "0. Chào mừng đến với Khóa học MCP"
2
+ sections:
3
+ - local: unit0/introduction
4
+ title: Chào mừng đến với Khóa học MCP
5
+
6
+ - title: "1. Giới thiệu về Giao Thức Ngữ Cảnh Mô Hình (MCP)"
7
+ sections:
8
+ - local: unit1/introduction
9
+ title: Giới thiệu về Giao Thức Ngữ Cảnh Mô Hình (MCP)
10
+ - local: unit1/key-concepts
11
+ title: Khái niệm và Thuật ngữ chính
12
+ - local: unit1/architectural-components
13
+ title: Các thành phần kiến trúc
14
+ - local: unit1/communication-protocol
15
+ title: Giao thức truyền thông
16
+ - local: unit1/capabilities
17
+ title: Hiểu về khả năng của MCP
18
+ - local: unit1/sdk
19
+ title: MCP SDK
20
+ - local: unit1/mcp-clients
21
+ title: MCP Clients
22
+ - local: unit1/gradio-mcp
23
+ title: Tích hợp Gradio với MCP
24
+
25
+ - title: "2. Trường hợp sử dụng: Ứng dụng MCP đầu cuối"
26
+ sections:
27
+ - local: unit2/introduction
28
+ title: Giới thiệu về Xây dựng Ứng dụng MCP
29
+ - local: unit2/gradio-server
30
+ title: Xây dựng Máy chủ Gradio MCP
31
+ - local: unit2/clients
32
+ title: Sử dụng MCP Clients với ứng dụng của bạn
33
+ - local: unit2/gradio-client
34
+ title: Xây dựng MCP Clients bằng Gradio
35
+ - local: unit2/tiny-agents
36
+ title: Xây dựng Tiny Agent với TypeScript
37
+
38
+ - title: "3. Trường hợp sử dụng: Phát triển MCP Nâng cao"
39
+ sections:
40
+ - local: unit3/introduction
41
+ title: Sắp ra mắt
42
+
43
+ - title: "Các chương bổ trợ"
44
+ sections:
45
+ - local: unit4/introduction
46
+ title: Sắp ra mắt
units/vi/unit0/introduction.mdx ADDED
@@ -0,0 +1,135 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Chào mừng bạn đến với 🤗 Khóa học Giao Thức Ngữ Cảnh Mô Hình (MCP)
2
+
3
+ ![MCP Course thumbnail](https://huggingface.co/datasets/mcp-course/images/resolve/main/unit0/1.png)
4
+
5
+ Chào mừng các bạn đến với chủ đề thú vị nhất trong AI hiện nay: **Giao Thức Ngữ Cảnh Mô Hình (MCP)**!
6
+
7
+ Khóa học miễn phí này sẽ dẫn dắt các bạn **từ người mới bắt đầu trở thành người am hiểu** về cách sử dụng và xây dựng ứng dụng với MCP.
8
+
9
+ Chương đầu tiên sẽ giúp bạn làm quen:
10
+ * Khám phá **giáo trình khóa học**
11
+ * **Nhận thêm thông tin về quy trình cấp chứng chỉ và lịch trình**
12
+ * Làm quen với đội ngũ xây dựng khóa học
13
+ * Tạo **tài khoản** của bạn
14
+ * **Tham gia Discord** để gặp gỡ bạn học và chúng mình
15
+
16
+ Cùng bắt đầu thôi!
17
+
18
+ ## Bạn sẽ học được gì từ khóa học này?
19
+
20
+ Trong khóa học này, các bạn sẽ:
21
+ * 📖 Nghiên cứu MCP về **lý thuyết, thiết kế và thực hành**
22
+ * 🧑‍💻 Học cách **sử dụng các SDK và framework MCP phổ biến**
23
+ * 💾 **Chia sẻ dự án** và khám phá ứng dụng từ cộng đồng
24
+ * 🏆 Tham gia các bài tập lớn để **đánh giá cách triển khai MCP của bạn so với các học viên khác**
25
+ * 🎓 **Nhận chứng chỉ hoàn thành** bằng cách hoàn thành các bài tập
26
+
27
+ Và còn nhiều hơn thế!
28
+
29
+ Kết thúc khóa học, bạn sẽ hiểu **cách MCP hoạt động và cách xây dựng ứng dụng AI sử dụng dữ liệu/công cụ bên ngoài theo chuẩn MCP mới nhất**.
30
+
31
+ Đừng quên [**đăng ký khóa học!**](https://huggingface.co/mcp-course)
32
+
33
+ ## Cấu trúc khóa học như thế nào?
34
+
35
+ Khóa học bao gồm:
36
+ * _Chương nền tảng_: nơi bạn học **khái niệm lý thuyết** về MCP
37
+ * _Thực hành_: nơi bạn học **cách sử dụng SDK MCP** để xây dựng ứng dụng. Các phần thực hành sẽ có môi trường được cấu hình sẵn
38
+ * _Bài tập tình huống_: nơi bạn áp dụng kiến thức đã học để giải quyết vấn đề thực tế do bạn lựa chọn
39
+ * _Hợp tác_: Chúng tôi hợp tác với các đối tác của Hugging Face để mang đến cho bạn những triển khai MCP mới nhất
40
+
41
+ **Khóa học này là dự án sống, phát triển cùng phản hồi và đóng góp của bạn!** Hãy thoải mái tạo issue/PR trên GitHub và thảo luận tại Discord server của chúng ta.
42
+
43
+ Sau khi hoàn thành khóa học, bạn có thể gửi phản hồi 👉 qua [biểu mẫu này]
44
+
45
+ ## Giáo trình chi tiết
46
+
47
+ Dưới đây là **giáo trình tổng quan**. Danh sách chi tiết sẽ được cập nhật theo từng chương.
48
+
49
+ | Chương | Chủ đề | Mô tả |
50
+ | ------- | ------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
51
+ | 0 | Làm quen | Thiết lập công cụ và nền tảng cần dùng |
52
+ | 1 | Nguyên lý, kiến trúc và khái niệm cốt lõi của MCP | Giải thích khái niệm cơ bản, kiến trúc và thành phần của MCP. Minh họa trường hợp sử dụng đơn giản với MCP |
53
+ | 2 | Ứng dụng end-to-end: MCP trong thực tế | Xây dựng ứng dụng MCP end-to-end đơn giản để chia sẻ với cộng đồng |
54
+ | 3 | Triển khai ứng dụng: MCP trong thực tế | Xây dựng ứng dụng MCP triển khai thực tế sử dụng hệ sinh thái Hugging Face và dịch vụ đối tác |
55
+ | 4 | Chương bổ trợ | Các chương nâng cao giúp bạn tận dụng tối đa khóa học, làm việc với thư viện và dịch vụ đối tác |
56
+
57
+ ## Yêu cầu đầu vào
58
+
59
+ Để theo học hiệu quả, bạn cần:
60
+ * Hiểu biết cơ bản về AI và các khái niệm LLM
61
+ * Quen thuộc với nguyên tắc phát triển phần mềm và khái niệm API
62
+ * Có kinh nghiệm với ít nhất một ngôn ngữ lập trình (ví dụ Python hoặc TypeScript sẽ được sử dụng minh họa)
63
+
64
+ Nếu bạn chưa có những kiến thức này, đừng lo! Dưới đây là một số tài nguyên hữu ích:
65
+
66
+ * [LLM Course](https://huggingface.co/learn/llm-course/) sẽ hướng dẫn bạn những kiến thức cơ bản về sử dụng và xây dựng với LLMs.
67
+ * [Agents Course](https://huggingface.co/learn/agents-course/) sẽ hướng dẫn bạn cách xây dựng AI Agents với LLMs.
68
+
69
+ <Tip>
70
+
71
+ Các khóa học trên không phải là điều kiện bắt buộc, vì vậy nếu bạn đã hiểu các khái niệm về LLM và Agents, các bạn có thể bắt đầu khóa học ngay bây giờ!
72
+
73
+ </Tip>
74
+
75
+ ## Tôi cần những công cụ gì?
76
+
77
+ Bạn chỉ cần 2 thứ:
78
+
79
+ * _Một máy tính_ có kết nối internet.
80
+ * _Tài khoản_: để truy cập tài nguyên khóa học và tạo dự án. Nếu chưa có tài khoản, bạn có thể tạo [tại đây](https://huggingface.co/join) (miễn phí).
81
+
82
+ ## Quy trình cấp chứng chỉ
83
+
84
+ Bạn có thể chọn học khóa học này ở _chế độ audit_, hoặc hoàn thành các hoạt động và _nhận một trong hai chứng chỉ mà chúng tôi cấp_. Nếu chọn audit, bạn vẫn có thể tham gia tất cả bài tập lớn và làm bài tập nếu muốn, **bạn không cần thông báo với chúng tôi**.
85
+
86
+ Quy trình cấp chứng chỉ **hoàn toàn miễn phí**:
87
+
88
+ * _Để nhận chứng chỉ kiến thức cơ bản_: bạn cần hoàn thành Chương 1. Dành cho học viên muốn cập nhật xu hướng mới nhất về MCP mà không cần xây dựng ứng dụng đầy đủ.
89
+ * _Để nhận chứng chỉ hoàn thành_: bạn cần hoàn thành các chương ứng dụng (2 và 3). Dành cho học viên muốn xây dựng ứng dụng hoàn chỉnh và chia sẻ với cộng đồng.
90
+
91
+ ## Tốc độ học được khuyến nghị?
92
+
93
+ Mỗi chương trong khóa học được thiết kế **để hoàn thành trong 1 tuần, với khoảng 3-4 giờ học mỗi tuần**.
94
+
95
+ Vì có thời hạn cụ thể, chúng tôi đưa ra lộ trình khuyến nghị:
96
+
97
+ ![Recommended Pace](https://huggingface.co/datasets/mcp-course/images/resolve/main/unit0/2.png)
98
+
99
+ ## Làm thế nào để học hiệu quả nhất?
100
+
101
+ Để học hiệu quả nhất, chúng tôi có vài lời khuyên:
102
+
103
+ 1. Tham gia nhóm học tập trên Discord: học cùng nhau luôn dễ dàng hơn. Hãy tham gia Discord của chúng tôi và xác thực tài khoản.
104
+ 2. **Làm bài kiểm tra và bài tập**: cách học tốt nhất là qua thực hành và tự đánh giá.
105
+ 3. **Lập lịch học để theo kịp tiến độ**: bạn có thể dùng lộ trình khuyến nghị bên dưới hoặc tự tạo lịch riêng.
106
+
107
+ ![Course advice](https://huggingface.co/datasets/mcp-course/images/resolve/main/unit0/3.png)
108
+
109
+ ## Về chúng tôi
110
+
111
+ Thông tin tác giả:
112
+
113
+ ### Ben Burtenshaw
114
+
115
+ Ben là Kỹ sư Máy học tại Hugging Face, tập trung vào xây dựng các ứng dụng LLM với phương pháp hậu huấn luyện và agentic.
116
+
117
+ <!-- ## Acknowledgments -->
118
+
119
+ <!-- We would like to extend our gratitude to the following individuals and partners for their invaluable contributions and support: -->
120
+
121
+ <!-- TODO: @burtenshaw add contributors and partners -->
122
+
123
+ ## Tôi phát hiện lỗi hoặc muốn cải thiện khóa học
124
+
125
+ Mọi đóng góp đều **được chào đón** 🤗
126
+
127
+ * Nếu bạn _phát hiện lỗi 🐛 trong notebook_, hãy mở một issue và **mô tả vấn đề**.
128
+ * Nếu bạn _muốn cải thiện khóa học_, bạn có thể mở một Pull Request.
129
+ * Nếu bạn _muốn thêm một mục đầy đủ hoặc một Chương mới_, cách tốt nhất là mở một issue và **mô tả nội dung bạn muốn thêm trước khi bắt đầu viết để chúng tôi có thể hướng dẫn bạn**.
130
+
131
+ ## Tôi vẫn còn thắc mắc
132
+
133
+ Hãy đặt câu hỏi của bạn trên máy chủ Discord của chúng tôi tại kênh #mcp-course-questions.
134
+
135
+ Giờ bạn đã có đầy đủ thông tin, hãy cùng nhau lên đường ⛵
units/vi/unit1/architectural-components.mdx ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Các thành phần kiến trúc của MCP
2
+
3
+ Ở chương trước, chúng ta đã thảo luận về các khái niệm và thuật ngữ chính của MCP. Giờ hãy cùng đi sâu hơn vào các thành phần kiến trúc tạo nên hệ sinh thái MCP.
4
+
5
+ ## Host, Client và Server
6
+
7
+ Giao Thức Ngữ Cảnh Mô Hình (MCP) được xây dựng trên kiến trúc client-server để kích hoạt giao tiếp có cấu trúc giữa các mô hình AI và hệ thống bên ngoài.
8
+
9
+ ![MCP Architecture](https://huggingface.co/datasets/mcp-course/images/resolve/main/unit1/4.png)
10
+
11
+ Kiến trúc MCP bao gồm ba thành phần chính với vai trò và trách nhiệm được xác định rõ ràng: Host, Client và Server. Chúng ta đã đề cập sơ qua ở phần trước, giờ hãy phân tích kỹ hơn từng thành phần.
12
+
13
+ ### Host
14
+
15
+ **Host** là ứng dụng AI tiếp xúc trực tiếp với người dùng cuối.
16
+
17
+ Ví dụ bao gồm:
18
+ - Ứng dụng chat AI như OpenAI ChatGPT hay Claude Desktop của Anthropic
19
+ - IDE tích hợp AI như Cursor, hoặc các công cụ như Continue.dev
20
+ - Các agent AI tùy chỉnh và ứng dụng xây dựng bằng thư viện như LangChain hay smolagents
21
+
22
+ Trách nhiệm của Host:
23
+ - Quản lý tương tác và quyền hạn người dùng
24
+ - Thiết lập kết nối tới MCP Server thông qua MCP Client
25
+ - Điều phối luồng xử lý giữa yêu cầu người dùng, xử lý LLM và công cụ bên ngoài
26
+ - Hiển thị kết quả cho người dùng dưới định dạng mạch lạc
27
+
28
+ Thông thường, người dùng sẽ chọn ứng dụng Host dựa trên nhu cầu cá nhân. Ví dụ, nhà phát triển có thể chọn Cursor cho khả năng chỉnh sửa mã mạnh mẽ, trong khi chuyên gia nghiệp vụ có thể dùng ứng dụng tùy chỉnh xây bằng smolagents.
29
+
30
+ ### Client
31
+
32
+ **Client** là thành phần trong ứng dụng Host quản lý giao tiếp với một MCP Server cụ thể. Đặc điểm chính:
33
+
34
+ - Mỗi Client duy trì kết nối 1:1 với một Server
35
+ - Xử lý các chi tiết giao thức của MCP
36
+ - Đóng vai trò trung gian giữa logic của Host và Server bên ngoài
37
+
38
+ ### Server
39
+
40
+ **Server** là chương trình/dịch vụ bên ngoài cung cấp khả năng truy cập vào các công cụ, nguồn dữ liệu hoặc dịch vụ thông qua giao thức MCP. Server:
41
+
42
+ - Cung cấp quyền truy cập vào các công cụ/dịch vụ bên ngoài
43
+ - Đóng vai trò lớp bao bọc nhẹ cho chức năng có sẵn
44
+ - Có thể chạy cục bộ (cùng máy với Host) hoặc từ xa (qua mạng)
45
+ - Cung cấp khả năng dưới định dạng chuẩn để Client khám phá và sử dụng
46
+
47
+ ## Luồng giao tiếp
48
+
49
+ Cùng xem cách các thành phần tương tác trong quy trình MCP điển hình:
50
+
51
+ <Tip>
52
+
53
+ Trong phần tiếp theo, chúng ta sẽ khám phá sâu hơn về giao thức giao tiếp với các ví dụ thực tế.
54
+
55
+ </Tip>
56
+
57
+ 1. **Tương tác người dùng**: Người dùng tương tác với ứng dụng **Host**, thể hiện nhu cầu hoặc truy vấn.
58
+
59
+ 2. **Xử lý Host**: **Host** xử lý đầu vào, có thể dùng LLM để hiểu yêu cầu và xác định cần dùng công cụ nào.
60
+
61
+ 3. **Kết nối Client**: **Host** hướng dẫn **Client** kết nối tới Server phù hợp.
62
+
63
+ 4. **Khám phá khả năng**: **Client** truy vấn **Server** để biết các khả năng (Công cụ, Tài nguyên, Prompt) mà nó cung cấp.
64
+
65
+ 5. **Kích hoạt khả năng**: Dựa trên nhu cầu người dùng hoặc quyết định của LLM, Host yêu cầu **Client** kích hoạt khả năng cụ thể từ **Server**.
66
+
67
+ 6. **Thực thi Server**: **Server** thực thi chức năng được yêu cầu và trả kết quả về **Client**.
68
+
69
+ 7. **Tích hợp kết quả**: **Client** chuyển kết quả về **Host**, nơi tích hợp chúng vào ngữ cảnh LLM hoặc hiển thị trực tiếp cho người dùng.
70
+
71
+ Ưu điểm chính của kiến trúc này là tính mô-đun. Một Host duy nhất có thể kết nối với nhiều Server cùng lúc thông qua các Client khác nhau. Có thể thêm Server mới vào hệ sinh thái mà không cần thay đổi Host hiện có. Có thể dễ dàng kết hợp các khả năng trên nhiều Server khác nhau.
72
+
73
+ <Tip>
74
+
75
+ Như đã thảo luận ở phần trước, tính mô-đun này biến bài toán tích hợp M×N truyền thống (khi M ứng dụng AI kết nối với N công cụ/dịch vụ) thành một bài toán M+N dễ quản lý hơn - nơi mỗi Host và Server chỉ cần triển khai chuẩn MCP một lần.
76
+
77
+ </Tip>
78
+
79
+ Kiến trúc này trông có vẻ đơn giản, nhưng sức mạnh thực sự nằm ở việc chuẩn hóa giao thức truyền thông và sự phân tách rõ ràng trách nhiệm giữa các thành phần. Thiết kế này cho phép tạo ra một hệ sinh thái gắn kết nơi các mô hình AI có thể kết nối liền mạch với một mảng các công cụ và nguồn dữ liệu bên ngoài ngày càng phát triển.
80
+
81
+ ## Kết luận
82
+
83
+ Những mẫu tương tác này được định hướng bởi các nguyên tắc chính định hình thiết kế và sự phát triển của MCP. Giao thức nhấn mạnh **tính chuẩn hóa** thông qua việc cung cấp một giao thức kết nối phổ quát cho AI, đồng thời duy trì **sự đơn giản** bằng cách giữ phần lõi giao thức dễ hiểu nhưng vẫn hỗ trợ các tính năng nâng cao. **An toàn** được ưu tiên thông qua yêu cầu phê duyệt rõ ràng từ người dùng cho các thao tác nhạy cảm, trong khi khả năng khám phá cho phép phát hiện động các chức năng. Giao thức được xây dựng với tư duy **mở rộng**, hỗ trợ phát triển thông qua phiên bản hóa và đàm phán chức năng, đồng thời đảm bảo **khả năng tương tác** giữa các triển khai và môi trường khác nhau.
84
+
85
+ Trong phần tiếp theo, chúng ta sẽ khám phá giao thức truyền thông giúp các thành phần này phối hợp hiệu quả với nhau.
units/vi/unit1/capabilities.mdx ADDED
@@ -0,0 +1,377 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Hiểu về Khả năng của MCP
2
+
3
+ Các MCP Server cung cấp nhiều khả năng khác nhau cho Client thông qua giao thức truyền thông. Những khả năng này được chia thành bốn loại chính, mỗi loại có đặc điểm và trường hợp sử dụng riêng. Hãy cùng khám phá các nguyên thủy cốt lõi tạo nền tảng cho chức năng của MCP.
4
+
5
+ <Tip>
6
+
7
+ Trong phần này, chúng ta sẽ xem các ví dụ dưới dạng hàm độc lập với framework trong mỗi ngôn ngữ. Mục đích là tập trung vào khái niệm và cách chúng phối hợp với nhau, thay vì sự phức tạp của bất kỳ framework cụ thể nào.
8
+
9
+ Trong các chương tiếp theo, chúng ta sẽ xem cách triển khai các khái niệm này trong mã cụ thể của MCP.
10
+
11
+ </Tip>
12
+
13
+ ## Công cụ (Tools)
14
+
15
+ Công cụ là các hàm hoặc hành động có thể thực thi mà mô hình AI có thể gọi thông qua giao thức MCP.
16
+
17
+ - **Kiểm soát**: Công cụ thường **được kiểm soát bởi mô hình** (model-controlled), nghĩa là mô hình AI (LLM) quyết định khi nào gọi chúng dựa trên yêu cầu và ngữ cảnh của người dùng.
18
+ - **An toàn**: Do khả năng thực hiện các hành động có tác dụng phụ, việc thực thi công cụ có thể nguy hiểm. Vì vậy chúng thường yêu cầu sự chấp thuận rõ ràng từ người dùng.
19
+ - **Trường hợp sử dụng**: Gửi tin nhắn, tạo ticket, truy vấn API, thực hiện tính toán.
20
+
21
+ **Ví dụ**: Một công cụ thời tiết lấy dữ liệu thời tiết hiện tại cho một địa điểm:
22
+
23
+ <hfoptions id="tool-example">
24
+ <hfoption id="python">
25
+
26
+ <details>
27
+ <summary>Bấm để xem bản dịch tiếng Việt</summary>
28
+
29
+ ```python
30
+ def get_weather(location: str) -> dict:
31
+ """Nhận thông tin thời tiết hiện tại ở một địa điểm cụ thể."""
32
+ # Connect to weather API and fetch data
33
+ return {
34
+ "temperature": 72,
35
+ "conditions": "Sunny",
36
+ "humidity": 45
37
+ }
38
+ ```
39
+ </details>
40
+
41
+ ```python
42
+ def get_weather(location: str) -> dict:
43
+ """Get the current weather for a specified location."""
44
+ # Connect to weather API and fetch data
45
+ return {
46
+ "temperature": 72,
47
+ "conditions": "Sunny",
48
+ "humidity": 45
49
+ }
50
+ ```
51
+
52
+ </hfoption>
53
+ <hfoption id="javascript">
54
+
55
+ <details>
56
+ <summary>Bấm để xem bản dịch tiếng Việt</summary>
57
+
58
+ ```javascript
59
+ function getWeather(location) {
60
+ // Kết nối đến API thời tiết và lấy dữ liệu
61
+ return {
62
+ temperature: 72,
63
+ conditions: 'Sunny',
64
+ humidity: 45
65
+ };
66
+ }
67
+ ```
68
+ </details>
69
+
70
+ ```javascript
71
+ function getWeather(location) {
72
+ // Connect to weather API and fetch data
73
+ return {
74
+ temperature: 72,
75
+ conditions: 'Sunny',
76
+ humidity: 45
77
+ };
78
+ }
79
+ ```
80
+
81
+ </hfoption>
82
+ </hfoptions>
83
+
84
+ ## Tài nguyên (Resources)
85
+
86
+ Tài nguyên cung cấp quyền truy cập chỉ đọc (read-only) vào các nguồn dữ liệu, cho phép mô hình AI truy xuất ngữ cảnh mà không cần thực thi logic phức tạp.
87
+
88
+ - **Kiểm soát**: Tài nguyên **được kiểm soát bởi ứng dụng** (application-controlled), nghĩa là ứng dụng Host thường quyết định khi nào truy cập chúng.
89
+ - **Bản chất**: Được thiết kế để truy xuất dữ liệu với tính toán tối thiểu, tương tự các endpoint GET trong REST API.
90
+ - **An toàn**: Vì chỉ đọc nên chúng thường ít rủi ro bảo mật hơn so với Công cụ.
91
+ - **Trường hợp sử dụng**: Truy cập nội dung file, lấy bản ghi cơ sở dữ liệu, đọc thông tin cấu hình.
92
+
93
+ **Ví dụ**: Một tài nguyên cung cấp quyền truy cập vào nội dung file:
94
+
95
+ <hfoptions id="resource-example">
96
+ <hfoption id="python">
97
+
98
+ <details>
99
+ <summary>Bấm để xem bản dịch tiếng Việt</summary>
100
+
101
+ ```python
102
+ def read_file(file_path: str) -> str:
103
+ """Đọc nội dung của file tại đường dẫn được chỉ định."""
104
+ with open(file_path, 'r') as f:
105
+ return f.read()
106
+ ```
107
+ </details>
108
+
109
+ ```python
110
+ def read_file(file_path: str) -> str:
111
+ """Read the contents of a file at the specified path."""
112
+ with open(file_path, 'r') as f:
113
+ return f.read()
114
+ ```
115
+
116
+ </hfoption>
117
+ <hfoption id="javascript">
118
+
119
+ <details>
120
+ <summary>Bấm để xem bản dịch tiếng Việt</summary>
121
+
122
+ ```javascript
123
+ function readFile(filePath) {
124
+ // Sử dụng fs.readFile để đọc nội dung file
125
+ const fs = require('fs');
126
+ return new Promise((resolve, reject) => {
127
+ fs.readFile(filePath, 'utf8', (err, data) => {
128
+ if (err) {
129
+ reject(err);
130
+ return;
131
+ }
132
+ resolve(data);
133
+ });
134
+ });
135
+ }
136
+ ```
137
+ </details>
138
+
139
+ ```javascript
140
+ function readFile(filePath) {
141
+ // Using fs.readFile to read file contents
142
+ const fs = require('fs');
143
+ return new Promise((resolve, reject) => {
144
+ fs.readFile(filePath, 'utf8', (err, data) => {
145
+ if (err) {
146
+ reject(err);
147
+ return;
148
+ }
149
+ resolve(data);
150
+ });
151
+ });
152
+ }
153
+ ```
154
+
155
+ </hfoption>
156
+ </hfoptions>
157
+
158
+ ## Lời nhắc
159
+
160
+ Lời nhắc (Prompts) là các mẫu hoặc quy trình làm việc được định nghĩa trước nhằm hướng dẫn tương tác giữa người dùng, Mô hình AI và khả năng của Server.
161
+
162
+ - **Kiểm soát**: Lời nhắc **do người dùng kiểm soát**, thường được hiển thị dưới dạng các tùy chọn trong giao diện ứng dụng Host.
163
+ - **Mục đích**: Chúng cấu trúc các tương tác để tối ưu hóa việc sử dụng Công cụ và Tài nguyên sẵn có.
164
+ - **Lựa chọn**: Người dùng thường chọn một lời nhắc trước khi Mô hình AI bắt đầu xử lý, thiết lập ngữ cảnh cho tương tác.
165
+ - **Trường hợp sử dụng**: Quy trình làm việc phổ biến, mẫu tác vụ chuyên biệt, tương tác có hướng dẫn.
166
+
167
+ **Ví dụ**: Mẫu lời nhắc để tạo đánh giá mã nguồn:
168
+
169
+ <hfoptions id="prompt-example">
170
+ <hfoption id="python">
171
+
172
+ <details>
173
+ <summary>Bấm để xem bản dịch tiếng Việt</summary>
174
+
175
+ ```python
176
+ def code_review(code: str, language: str) -> list:
177
+ """Tạo đánh giá mã nguồn cho đoạn code được cung cấp."""
178
+ return [
179
+ {
180
+ "role": "system",
181
+ "content": f"You are a code reviewer examining {language} code. Provide a detailed review highlighting best practices, potential issues, and suggestions for improvement."
182
+ },
183
+ {
184
+ "role": "user",
185
+ "content": f"Please review this {language} code:\n\n```{language}\n{code}\n```"
186
+ }
187
+ ]
188
+ ```
189
+ </details>
190
+
191
+ ```python
192
+ def code_review(code: str, language: str) -> list:
193
+ """Generate a code review for the provided code snippet."""
194
+ return [
195
+ {
196
+ "role": "system",
197
+ "content": f"You are a code reviewer examining {language} code. Provide a detailed review highlighting best practices, potential issues, and suggestions for improvement."
198
+ },
199
+ {
200
+ "role": "user",
201
+ "content": f"Please review this {language} code:\n\n```{language}\n{code}\n```"
202
+ }
203
+ ]
204
+ ```
205
+
206
+ </hfoption>
207
+ <hfoption id="javascript">
208
+
209
+ <details>
210
+ <summary>Bấm để xem bản dịch tiếng Việt</summary>
211
+
212
+ ```javascript
213
+ function codeReview(code, language) {
214
+ return [
215
+ {
216
+ role: 'system',
217
+ content: `You are a code reviewer examining ${language} code. Provide a detailed review highlighting best practices, potential issues, and suggestions for improvement.`
218
+ },
219
+ {
220
+ role: 'user',
221
+ content: `Please review this ${language} code:\n\n\`\`\`${language}\n${code}\n\`\`\``
222
+ }
223
+ ];
224
+ }
225
+ ```
226
+ </details>
227
+
228
+ ```javascript
229
+ function codeReview(code, language) {
230
+ return [
231
+ {
232
+ role: 'system',
233
+ content: `You are a code reviewer examining ${language} code. Provide a detailed review highlighting best practices, potential issues, and suggestions for improvement.`
234
+ },
235
+ {
236
+ role: 'user',
237
+ content: `Please review this ${language} code:\n\n\`\`\`${language}\n${code}\n\`\`\``
238
+ }
239
+ ];
240
+ }
241
+ ```
242
+
243
+ </hfoption>
244
+ </hfoptions>
245
+
246
+ ## Lấy mẫu (Sampling)
247
+
248
+ Lấy mẫu cho phép Server yêu cầu Client (cụ thể là ứng dụng Host) thực hiện các tương tác LLM.
249
+
250
+ - **Kiểm soát**: Lấy mẫu **do Server khởi xướng** nhưng cần sự hỗ trợ từ Client/Host.
251
+ - **Mục đích**: Kích hoạt các hành vi tự chủ từ Server và các tương tác đệ quy/đa bước tiềm năng.
252
+ - **An toàn**: Giống như Công cụ, các thao tác lấy mẫu thường yêu cầu sự chấp thuận của người dùng.
253
+ - **Trường hợp sử dụng**: Các tác vụ đa bước phức tạp, quy trình làm việc của agent tự động, quá trình tương tác.
254
+
255
+ **Ví dụ**: Server có thể yêu cầu Client phân tích dữ liệu đã xử lý:
256
+
257
+ <hfoptions id="sampling-example">
258
+ <hfoption id="python">
259
+
260
+ <details>
261
+ <summary>Bấm để xem bản dịch tiếng Việt</summary>
262
+ ```python
263
+ def request_sampling(messages, system_prompt=None, include_context="none"):
264
+ """Yêu cầu lấy mẫu LLM từ máy khách."""
265
+ # Trong triển khai thực tế, phần này sẽ gửi yêu cầu đến máy khách
266
+ return {
267
+ "role": "assistant",
268
+ "content": "Analysis of the provided data..."
269
+ }
270
+ ```
271
+ </details>
272
+
273
+ ```python
274
+ def request_sampling(messages, system_prompt=None, include_context="none"):
275
+ """Request LLM sampling from the client."""
276
+ # In a real implementation, this would send a request to the client
277
+ return {
278
+ "role": "assistant",
279
+ "content": "Analysis of the provided data..."
280
+ }
281
+ ```
282
+
283
+ </hfoption>
284
+ <hfoption id="javascript">
285
+
286
+ <details>
287
+ <summary>Bấm để xem bản dịch tiếng Việt</summary>
288
+ ```javascript
289
+ function requestSampling(messages, systemPrompt = null, includeContext = 'none') {
290
+ // Trong triển khai thực tế, phần này sẽ gửi yêu cầu đến máy khách
291
+ return {
292
+ role: 'assistant',
293
+ content: 'Analysis of the provided data...'
294
+ };
295
+ }
296
+
297
+ function handleSamplingRequest(request) {
298
+ const { messages, systemPrompt, includeContext } = request;
299
+ // Trong triển khai thực tế, phần này sẽ xử lý yêu cầu và trả về phản hồi
300
+ return {
301
+ role: 'assistant',
302
+ content: 'Response to the sampling request...'
303
+ };
304
+ }
305
+ ```
306
+ </details>
307
+
308
+ ```javascript
309
+ function requestSampling(messages, systemPrompt = null, includeContext = 'none') {
310
+ // In a real implementation, this would send a request to the client
311
+ return {
312
+ role: 'assistant',
313
+ content: 'Analysis of the provided data...'
314
+ };
315
+ }
316
+
317
+ function handleSamplingRequest(request) {
318
+ const { messages, systemPrompt, includeContext } = request;
319
+ // In a real implementation, this would process the request and return a response
320
+ return {
321
+ role: 'assistant',
322
+ content: 'Response to the sampling request...'
323
+ };
324
+ }
325
+ ```
326
+
327
+ </hfoption>
328
+ </hfoptions>
329
+
330
+ Quy trình lấy mẫu (sampling) diễn ra theo các bước sau:
331
+ 1. Server gửi yêu cầu `sampling/createMessage` đến client
332
+ 2. Client xem xét và có thể chỉnh sửa yêu cầu này
333
+ 3. Client lấy mẫu từ một LLM
334
+ 4. Client kiểm tra kết quả hoàn thiện
335
+ 5. Client trả kết quả về cho server
336
+
337
+ <Tip>
338
+
339
+ Thiết kế human-in-the-loop (có sự tham gia của con người trong vòng lặp) này đảm bảo người dùng duy trì quyền kiểm soát những gì LLM nhìn thấy và tạo ra. Khi triển khai sampling, điều quan trọng là phải cung cấp các lời nhắc rõ ràng, được cấu trúc tốt và bao gồm ngữ cảnh liên quan.
340
+
341
+ </Tip>
342
+
343
+ ## Cách Các Khả Năng Phối Hợp
344
+
345
+ Hãy cùng xem cách các khả năng này phối hợp với nhau để tạo ra các tương tác phức tạp. Trong bảng dưới đây, chúng ta đã liệt kê các khả năng, đối tượng kiểm soát, hướng kiểm soát và một số chi tiết khác.
346
+
347
+ | Khả năng | Được kiểm soát bởi | Hướng | Tác dụng phụ | Cần phê duyệt | Trường hợp sử dụng điển hình |
348
+ |------------|-------------------|-----------|--------------------|---------------|-----------------------------------|
349
+ | Tools | Mô hình (LLM) | Client → Server | Có (có thể) | Có | Hành động, gọi API, thao tác dữ liệu |
350
+ | Resources | Ứng dụng | Client → Server | Không (chỉ đọc) | Thường không | Truy xuất dữ liệu, thu thập ngữ cảnh |
351
+ | Prompts | Người dùng | Server → Client | Không | Không (do người dùng chọn) | Quy trình làm việc có hướng dẫn, mẫu chuyên biệt |
352
+ | Sampling | Server | Server → Client → Server | Gián tiếp | Có | Tác vụ nhiều bước, hành vi agentic |
353
+
354
+ Các khả năng này được thiết kế để bổ trợ cho nhau theo những cách sau:
355
+
356
+ 1. Người dùng có thể chọn **Prompt** để bắt đầu quy trình làm việc chuyên biệt
357
+ 2. Prompt có thể bao gồm ngữ cảnh từ **Tài nguyên**
358
+ 3. Trong quá trình xử lý, mô hình AI có thể gọi **Công cụ** để thực hiện hành động cụ thể
359
+ 4. Với các thao tác phức tạp, Server có thể sử dụng **Sampling** để yêu cầu xử lý LLM bổ sung
360
+
361
+ Sự phân biệt giữa chúng tạo ra cấu trúc rõ ràng cho các tương tác MCP, cho phép các mô hình AI truy cập thông tin, thực hiện hành động và tham gia vào các quy trình làm việc phức tạp trong khi vẫn duy trì các ranh giới kiểm soát phù hợp.
362
+
363
+ ## Quá Trình Khám Phá
364
+
365
+ Một tính năng chính của MCP là khả năng khám phá động. Khi Client kết nối với Server, nó có thể truy vấn các Tools, Resources và Prompts khả dụng thông qua các phương thức danh sách cụ thể:
366
+
367
+ - `tools/list`: Khám phá Tools khả dụng
368
+ - `resources/list`: Khám phá Resources khả dụng
369
+ - `prompts/list`: Khám phá Prompts khả dụng
370
+
371
+ Cơ chế khám phá động này cho phép Client thích ứng với các khả năng cụ thể mà mỗi Server cung cấp mà không cần biết trước về chức năng của Server.
372
+
373
+ ## Kết Luận
374
+
375
+ Hiểu rõ các yếu tố cốt lõi này là điều cần thiết để làm việc hiệu quả với MCP. Bằng cách cung cấp các loại khả năng riêng biệt với ranh giới kiểm soát rõ ràng, MCP cho phép các tương tác mạnh mẽ giữa mô hình AI và hệ thống bên ngoài trong khi vẫn duy trì các cơ chế an toàn và kiểm soát phù hợp.
376
+
377
+ Trong phần tiếp theo, chúng ta sẽ khám phá cách Gradio tích hợp với MCP để cung cấp các giao diện dễ sử dụng cho các khả năng này.
units/vi/unit1/communication-protocol.mdx ADDED
@@ -0,0 +1,223 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Giao Thức Truyền Thông
2
+
3
+ MCP định nghĩa một giao thức truyền thông chuẩn hóa cho phép Client và Server trao đổi thông điệp một cách nhất quán, dễ dự đoán. Sự chuẩn hóa này rất quan trọng để đảm bảo khả năng tương tác trong cộng đồng. Trong phần này, chúng ta sẽ khám phá cấu trúc giao thức và cơ chế vận chuyển được sử dụng trong MCP.
4
+
5
+ <Tip warning={true}>
6
+
7
+ Chúng ta đang đi sâu vào những chi tiết phức tạp của giao thức MCP (nguyên văn: "nitty-gritty" - chỉ những chi tiết quan trọng và phức tạp). Bạn không cần biết tất cả những điều này để xây dựng với MCP, nhưng nên biết về sự tồn tại và cách hoạt động của nó.
8
+
9
+ </Tip>
10
+
11
+ ## JSON-RPC: Nền Tảng
12
+
13
+ Cốt lõi của MCP sử dụng **JSON-RPC 2.0** làm định dạng thông điệp cho mọi giao tiếp giữa Client và Server. JSON-RPC là giao thức gọi thủ tục từ xa nhẹ được mã hóa bằng JSON, mang lại các ưu điểm:
14
+
15
+ - Dễ đọc và dễ gỡ lỗi
16
+ - Không phụ thuộc ngôn ngữ, hỗ trợ triển khai trên mọi môi trường lập trình
17
+ - Được thiết lập tốt với đặc tả rõ ràng và được áp dụng rộng rãi
18
+
19
+ ![message types](https://huggingface.co/datasets/mcp-course/images/resolve/main/unit1/5.png)
20
+
21
+ Giao thức định nghĩa ba loại thông điệp:
22
+
23
+ ### 1. Yêu Cầu (Requests)
24
+
25
+ Được gửi từ Client đến Server để khởi tạo một thao tác. Thông điệp Yêu cầu bao gồm:
26
+ - Định danh duy nhất (`id`)
27
+ - Tên phương thức cần gọi (ví dụ: `tools/call`)
28
+ - Tham số cho phương thức (nếu có)
29
+
30
+ Ví dụ Yêu cầu:
31
+
32
+ ```json
33
+ {
34
+ "jsonrpc": "2.0",
35
+ "id": 1,
36
+ "method": "tools/call",
37
+ "params": {
38
+ "name": "weather",
39
+ "arguments": {
40
+ "location": "San Francisco"
41
+ }
42
+ }
43
+ }
44
+ ```
45
+
46
+ ### 2. Phản Hồi (Responses)
47
+
48
+ Được gửi từ Server đến Client để trả lời Yêu cầu. Thông điệp Phản hồi bao gồm:
49
+ - `id` giống với Yêu cầu tương ứng
50
+ - Hoặc `result` (thành công) hoặc `error` (thất bại)
51
+
52
+ Ví dụ Phản hồi Thành công:
53
+ ```json
54
+ {
55
+ "jsonrpc": "2.0",
56
+ "id": 1,
57
+ "result": {
58
+ "temperature": 62,
59
+ "conditions": "Partly cloudy"
60
+ }
61
+ }
62
+ ```
63
+
64
+ Ví dụ Phản hồi Lỗi:
65
+ ```json
66
+ {
67
+ "jsonrpc": "2.0",
68
+ "id": 1,
69
+ "error": {
70
+ "code": -32602,
71
+ "message": "Invalid location parameter"
72
+ }
73
+ }
74
+ ```
75
+
76
+ ### 3. Thông Báo
77
+
78
+ Thông điệp một chiều không yêu cầu phản hồi. Thường được gửi từ Server đến Client để cập nhật tiến trình hoặc thông báo sự kiện.
79
+
80
+ Ví dụ Thông Báo:
81
+ ```json
82
+ {
83
+ "jsonrpc": "2.0",
84
+ "method": "progress",
85
+ "params": {
86
+ "message": "Processing data...",
87
+ "percent": 50
88
+ }
89
+ }
90
+ ```
91
+
92
+ ## Cơ Chế Vận Chuyển
93
+
94
+ JSON-RPC định nghĩa định dạng thông điệp, nhưng MCP cũng chỉ định cách thức các thông điệp này được truyền tải giữa Server đến Client. Hai cơ chế vận chuyển chính được hỗ trợ:
95
+
96
+ ### stdio (Đầu vào/Đầu ra chuẩn)
97
+
98
+ Cơ chế stdio được dùng cho giao tiếp cục bộ, khi Client và Server chạy trên cùng máy:
99
+
100
+ Ứng dụng chủ khởi chạy Server như một tiến trình con và giao tiếp bằng cách ghi vào đầu vào chuẩn (stdin) và đọc từ đầu ra chuẩn (stdout).
101
+
102
+ <Tip>
103
+
104
+ **Trường hợp sử dụng** cho phương thức truyền tải này là các công cụ local như truy cập hệ thống file hoặc chạy script local.
105
+
106
+ </Tip>
107
+
108
+ **Ưu điểm** chính của phương thức này là đơn giản, không yêu cầu cấu hình mạng và được hệ điều hành cách ly an toàn.
109
+
110
+ ### HTTP + SSE (Server-Sent Events) / HTTP có thể streaming
111
+
112
+ Phương thức HTTP + SSE được dùng cho giao tiếp từ xa khi Client và Server có thể ở các máy khác nhau:
113
+
114
+ Giao tiếp diễn ra qua HTTP, với Server sử dụng Server-Sent Events (SSE) để đẩy các cập nhật tới Client qua kết nối liên tục.
115
+
116
+ <Tip>
117
+
118
+ **Trường hợp sử dụng** cho phương thức này là kết nối tới API từ xa, dịch vụ đám mây hoặc tài nguyên dùng chung.
119
+
120
+ </Tip>
121
+
122
+ **Ưu điểm** chính là hoạt động được qua mạng, tích hợp được với dịch vụ web và tương thích với môi trường serverless.
123
+
124
+ Các bản cập nhật gần đây của chuẩn MCP đã giới thiệu hoặc cải tiến "Streamable HTTP", mang lại tính linh hoạt cao hơn bằng cách cho phép Server nâng cấp động lên SSE để streaming khi cần, đồng thời vẫn giữ được tính tương thích với môi trường serverless.
125
+
126
+ ## Vòng đời tương tác
127
+
128
+ Ở phần trước, chúng ta đã thảo luận về vòng đời của một lượt tương tác đơn lẻ giữa Client (💻) và Server (🌐). Giờ h��y xem xét vòng đời của một lượt tương tác hoàn chỉnh trong ngữ cảnh giao thức MCP.
129
+
130
+ Giao thức MCP định nghĩa vòng đời tương tác có cấu trúc giữa Client và Server:
131
+
132
+ ### Khởi tạo
133
+
134
+ Client kết nối tới Server và hai bên trao đổi phiên bản giao thức cùng các tính năng hỗ trợ, Server phản hồi với phiên bản giao thức và tính năng mà nó hỗ trợ.
135
+
136
+ <table style="width: 100%;">
137
+ <tr>
138
+ <td style="background-color: lightgreen; text-align: center; padding: 10px; border: 1px solid #ccc; border-radius: 4px;">💻</td>
139
+ <td style="text-align: center;">→<br>initialize</td>
140
+ <td style="background-color: lightblue; text-align: center; padding: 10px; border: 1px solid #ccc; border-radius: 4px;">🌐</td>
141
+ </tr>
142
+ <tr>
143
+ <td style="background-color: lightgreen; text-align: center; padding: 10px; border: 1px solid #ccc; border-radius: 4px;">💻</td>
144
+ <td style="text-align: center;">←<br>response</td>
145
+ <td style="background-color: lightblue; text-align: center; padding: 10px; border: 1px solid #ccc; border-radius: 4px;">🌐</td>
146
+ </tr>
147
+ <tr>
148
+ <td style="background-color: lightgreen; text-align: center; padding: 10px; border: 1px solid #ccc; border-radius: 4px;">💻</td>
149
+ <td style="text-align: center;">→<br>initialized</td>
150
+ <td style="background-color: lightblue; text-align: center; padding: 10px; border: 1px solid #ccc; border-radius: 4px;">🌐</td>
151
+ </tr>
152
+ </table>
153
+
154
+ Client xác nhận hoàn tất khởi tạo qua thông báo.
155
+
156
+ ### Khám phá
157
+
158
+ Client yêu cầu thông tin về các tính năng khả dụng và Server phản hồi với danh sách công cụ có sẵn.
159
+
160
+ <table style="width: 100%;">
161
+ <tr>
162
+ <td style="background-color: lightgreen; text-align: center; padding: 10px; border: 1px solid #ccc; border-radius: 4px;">💻</td>
163
+ <td style="text-align: center;">→<br>tools/list</td>
164
+ <td style="background-color: lightblue; text-align: center; padding: 10px; border: 1px solid #ccc; border-radius: 4px;">🌐</td>
165
+ </tr>
166
+ <tr>
167
+ <td style="background-color: lightgreen; text-align: center; padding: 10px; border: 1px solid #ccc; border-radius: 4px;">💻</td>
168
+ <td style="text-align: center;">←<br>response</td>
169
+ <td style="background-color: lightblue; text-align: center; padding: 10px; border: 1px solid #ccc; border-radius: 4px;">🌐</td>
170
+ </tr>
171
+ </table>
172
+
173
+ Quá trình này có thể được lặp lại cho từng công cụ, tài nguyên hoặc loại prompt.
174
+
175
+ ### Thực thi
176
+
177
+ Client kích hoạt các khả năng dựa trên nhu cầu của Host.
178
+
179
+ <table style="width: 100%;">
180
+ <tr>
181
+ <td style="background-color: lightgreen; text-align: center; padding: 10px; border: 1px solid #ccc; border-radius: 4px;">💻</td>
182
+ <td style="text-align: center;">→<br>tools/call</td>
183
+ <td style="background-color: lightblue; text-align: center; padding: 10px; border: 1px solid #ccc; border-radius: 4px;">🌐</td>
184
+ </tr>
185
+ <tr>
186
+ <td style="background-color: lightgreen; text-align: center; padding: 10px; border: 1px solid #ccc; border-radius: 4px;">💻</td>
187
+ <td style="text-align: center;">←<br>thông báo (tiến trình tùy chọn)</td>
188
+ <td style="background-color: lightblue; text-align: center; padding: 10px; border: 1px solid #ccc; border-radius: 4px;">🌐</td>
189
+ </tr>
190
+ <tr>
191
+ <td style="background-color: lightgreen; text-align: center; padding: 10px; border: 1px solid #ccc; border-radius: 4px;">💻</td>
192
+ <td style="text-align: center;">←<br>phản hồi</td>
193
+ <td style="background-color: lightblue; text-align: center; padding: 10px; border: 1px solid #ccc; border-radius: 4px;">🌐</td>
194
+ </tr>
195
+ </table>
196
+
197
+ ### Kết thúc
198
+
199
+ Kết nối được đóng một cách hợp lệ khi không còn cần thiết và Server xác nhận yêu cầu tắt.
200
+
201
+ <table style="width: 100%;">
202
+ <tr>
203
+ <td style="background-color: lightgreen; text-align: center; padding: 10px; border: 1px solid #ccc; border-radius: 4px;">💻</td>
204
+ <td style="text-align: center;">→<br>tắt máy</td>
205
+ <td style="background-color: lightblue; text-align: center; padding: 10px; border: 1px solid #ccc; border-radius: 4px;">🌐</td>
206
+ </tr>
207
+ <tr>
208
+ <td style="background-color: lightgreen; text-align: center; padding: 10px; border: 1px solid #ccc; border-radius: 4px;">💻</td>
209
+ <td style="text-align: center;">←<br>phản hồi</td>
210
+ <td style="background-color: lightblue; text-align: center; padding: 10px; border: 1px solid #ccc; border-radius: 4px;">🌐</td>
211
+ </tr>
212
+ <tr>
213
+ <td style="background-color: lightgreen; text-align: center; padding: 10px; border: 1px solid #ccc; border-radius: 4px;">💻</td>
214
+ <td style="text-align: center;">→<br>thoát</td>
215
+ <td style="background-color: lightblue; text-align: center; padding: 10px; border: 1px solid #ccc; border-radius: 4px;">🌐</td>
216
+ </tr>
217
+ </table>
218
+
219
+ Client gửi thông điệp thoát cuối cùng để hoàn tất việc kết thúc.
220
+
221
+ ## Tiến h��a của Giao thức
222
+
223
+ Giao thức MCP được thiết kế để có thể mở rộng và thích ứng. Giai đoạn khởi tạo bao gồm thương lượng phiên bản, cho phép tương thích ngược khi giao thức phát triển. Bên cạnh đó, việc khám phá khả năng cho phép Client thích ứng với các tính năng cụ thể mà mỗi Server cung cấp, cho phép kết hợp cả Máy chủ cơ bản và nâng cao trong cùng một hệ sinh thái.
units/vi/unit1/gradio-mcp.mdx ADDED
@@ -0,0 +1,188 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Tích hợp Gradio với MCP
2
+
3
+ Giờ chúng ta đã tìm hiểu các khái niệm cốt lõi của Giao Thức Ngữ Cảnh Mô Hình (MCP) và cách triển khai MCP Servers và Clients. Trong phần này, chúng ta sẽ làm mọi thứ dễ dàng hơn bằng cách sử dụng Gradio để tạo một MCP Server!
4
+
5
+ <Tip>
6
+
7
+ Gradio là thư viện Python nổi tiếng giúp tạo giao diện web tùy chỉnh nhanh chóng cho các mô hình học máy.
8
+
9
+ </Tip>
10
+
11
+ ## Giới thiệu về Gradio
12
+
13
+ Gradio cho phép các nhà phát triển tạo giao diện người dùng (UI) cho mô hình của họ chỉ với vài dòng mã Python. Thư viện này đặc biệt hữu ích cho:
14
+
15
+ - Tạo demo và nguyên mẫu
16
+ - Chia sẻ mô hình với người dùng không chuyên về kỹ thuật
17
+ - Kiểm tra và gỡ lỗi hành vi của mô hình
18
+
19
+ Với việc hỗ trợ thêm MCP, Gradio giờ đây cung cấp cách đơn giản để hiển thị các khả năng của mô hình AI thông qua giao thức MCP chuẩn hóa.
20
+
21
+ Kết hợp Gradio với MCP cho phép bạn tạo cả giao diện thân thiện với con người và công cụ truy cập được bằng AI với mã tối thiểu. Điều tuyệt nhất là Gradio đã được cộng đồng AI sử dụng rộng rãi, vì vậy bạn có thể dùng nó để chia sẻ MCP Servers của mình với người khác.
22
+
23
+ ## Điều kiện tiên quyết
24
+
25
+ Để sử dụng Gradio với hỗ trợ MCP, bạn cần cài đặt Gradio với phần mở rộng MCP:
26
+
27
+ ```bash
28
+ pip install "gradio[mcp]"
29
+ ```
30
+
31
+ Bạn cũng cần một ứng dụng LLM hỗ trợ gọi công cụ sử dụng giao thức MCP, như Cursor (được gọi là "MCP Hosts").
32
+
33
+ ## Tạo MCP Server với Gradio
34
+
35
+ Hãy cùng xem qua ví dụ cơ bản về cách tạo MCP Server bằng Gradio:
36
+
37
+ <details>
38
+ <summary>Bấm để xem bản dịch tiếng Việt</summary>
39
+ ```python
40
+ import gradio as gr
41
+
42
+ def letter_counter(word: str, letter: str) -> int:
43
+ """
44
+ Đếm số lần xuất hiện của một ký tự trong từ hoặc văn bản.
45
+
46
+ Args:
47
+ word (str): Văn bản đầu vào để tìm kiếm
48
+ letter (str): Ký tự cần tìm
49
+
50
+ Returns:
51
+ int: Số lần ký tự xuất hiện trong văn bản
52
+ """
53
+ word = word.lower()
54
+ letter = letter.lower()
55
+ count = word.count(letter)
56
+ return count
57
+
58
+ # Tạo giao diện Gradio tiêu chuẩn
59
+ demo = gr.Interface(
60
+ fn=letter_counter,
61
+ inputs=["textbox", "textbox"],
62
+ outputs="number",
63
+ title="Bộ đếm ký tự",
64
+ description="Nhập văn bản và một ký tự để đếm số lần ký tự đó xuất hiện trong văn bản."
65
+ )
66
+
67
+ # Khởi chạy cả giao diện web Gradio và MCP Server
68
+ if __name__ == "__main__":
69
+ demo.launch(mcp_server=True)
70
+ ```
71
+ </details>
72
+
73
+ ```python
74
+ import gradio as gr
75
+
76
+ def letter_counter(word: str, letter: str) -> int:
77
+ """
78
+ Count the number of occurrences of a letter in a word or text.
79
+
80
+ Args:
81
+ word (str): The input text to search through
82
+ letter (str): The letter to search for
83
+
84
+ Returns:
85
+ int: The number of times the letter appears in the text
86
+ """
87
+ word = word.lower()
88
+ letter = letter.lower()
89
+ count = word.count(letter)
90
+ return count
91
+
92
+ # Create a standard Gradio interface
93
+ demo = gr.Interface(
94
+ fn=letter_counter,
95
+ inputs=["textbox", "textbox"],
96
+ outputs="number",
97
+ title="Letter Counter",
98
+ description="Enter text and a letter to count how many times the letter appears in the text."
99
+ )
100
+
101
+ # Launch both the Gradio web interface and the MCP server
102
+ if __name__ == "__main__":
103
+ demo.launch(mcp_server=True)
104
+ ```
105
+
106
+ Với thiết lập này, hàm đếm ký tự của bạn giờ có thể truy cập qua:
107
+
108
+ 1. Giao diện web Gradio truyền thống cho tương tác trực tiếp của con người
109
+ 2. MCP Server có thể kết nối với các clients tương thích
110
+
111
+ MCP server sẽ truy cập được tại:
112
+ ```
113
+ http://your-server:port/gradio_api/mcp/sse
114
+ ```
115
+
116
+ Ứng dụng trông như thế này:
117
+
118
+ ![Gradio MCP Server](https://huggingface.co/datasets/mcp-course/images/resolve/main/unit1/7.png)
119
+
120
+ ## Cách thức hoạt động đằng sau hậu trường
121
+
122
+ Khi bạn thiết lập `mcp_server=True` trong `launch()`, những điều sau sẽ xảy ra:
123
+
124
+ 1. Các hàm Gradio được tự động chuyển đổi thành MCP Tools
125
+ 2. Các thành phần đầu vào ánh xạ thành lược đồ tham số công cụ
126
+ 3. Các thành phần đầu xác định định dạng phản hồi
127
+ 4. Server Gradio giờ cũng lắng nghe các tin nhắn theo giao thức MCP
128
+ 5. JSON-RPC qua HTTP+SSE được thiết lập cho giao tiếp client-server
129
+
130
+ ## Tính năng chính của tích hợp Gradio <> MCP
131
+
132
+ 1. **Chuyển đổi công cụ**: Mỗi API endpoint trong ứng dụng Gradio của bạn sẽ tự động chuyển thành MCP tool với tên, mô tả và lược đồ đầu vào tương ứng. Để xem các công cụ và lược đồ, truy cập `http://your-server:port/gradio_api/mcp/schema` hoặc vào link "View API" ở footer ứng dụng Gradio, sau đó click vào "MCP".
133
+
134
+ 2. **Hỗ trợ biến môi trường**: Có hai cách để kích hoạt chức năng MCP server:
135
+ - Dùng tham số `mcp_server` trong `launch()`:
136
+ ```python
137
+ demo.launch(mcp_server=True)
138
+ ```
139
+ - Dùng biến môi trường:
140
+ ```bash
141
+ export GRADIO_MCP_SERVER=True
142
+ ```
143
+
144
+ 3. **Xử lý file**: Server tự động xử lý chuyển đổi dữ liệu file bao gồm:
145
+ - Chuyển đổi chuỗi mã hóa base64 thành dữ liệu file
146
+ - Xử lý file ảnh và trả về đúng định dạng
147
+ - Quản lý bộ nhớ file tạm
148
+
149
+ Chúng ta **nên** truyền ảnh/file đầu vào dưới dạng URL đầy đủ ("http://..." hoặc "https://...") vì MCP Client không phải lúc nào cũng xử lý đúng file local.
150
+
151
+ 4. **Server MCP được host trên 🤗 Spaces**: Bạn có thể publish ứng dụng Gradio miễn phí trên Hugging Face Spaces để có MCP server được host miễn phí. Đây là ví dụ một Space như vậy: https://huggingface.co/spaces/abidlabs/mcp-tools
152
+
153
+ ## Mẹo xử lý sự cố
154
+
155
+ 1. **Gợi ý kiểu và chuỗi tài liệu**: Đảm bảo bạn cung cấp gợi ý kiểu và chuỗi tài liệu hợp lệ cho hàm. Chuỗi tài liệu cần có khối "Args:" với các tham số được thụt lề.
156
+
157
+ 2. **Đầu vào dạng chuỗi**: Khi không chắc chắn, hãy chấp nhận đối số đầu vào dạng `str` và chuyển đổi sang kiểu mong muốn bên trong hàm.
158
+
159
+ 3. **Hỗ trợ SSE**: Một số MCP Host không hỗ trợ MCP Server dùng SSE. Trong trường hợp đó, bạn có thể dùng `mcp-remote`:
160
+ ```json
161
+ {
162
+ "mcpServers": {
163
+ "gradio": {
164
+ "command": "npx",
165
+ "args": [
166
+ "mcp-remote",
167
+ "http://your-server:port/gradio_api/mcp/sse"
168
+ ]
169
+ }
170
+ }
171
+ }
172
+ ```
173
+
174
+ 4. **Khởi động lại**: Nếu gặp vấn đề kết nối, hãy thử khởi động lại cả MCP Client và MCP Server.
175
+
176
+ ## Chia sẻ MCP Server của bạn
177
+
178
+ Bạn có thể chia sẻ MCP Server bằng cách publish ứng dụng Gradio lên Hugging Face Spaces. Video dưới đây hướng dẫn cách tạo Hugging Face Space.
179
+
180
+ <Youtube id="3bSVKNKb_PY" />
181
+
182
+ Giờ bạn có thể chia sẻ MCP Server với người khác bằng cách chia sẻ Hugging Face Space của mình.
183
+
184
+ ## Kết luận
185
+
186
+ Việc tích hợp Gradio với MCP mang đến điểm khởi đầu dễ tiếp cận vào hệ sinh thái MCP. Bằng cách tận dụng sự đơn giản của Gradio và thêm chuẩn hóa từ MCP, các bạn có thể nhanh chóng tạo cả giao diện thân thiện với người dùng lẫn công cụ truy cập được bằng AI với ít code nhất.
187
+
188
+ Trong suốt khóa học này, chúng ta sẽ khám phá thêm nhiều cách triển khai MCP phức tạp hơn, nhưng Gradio vẫn là điểm khởi đầu tuyệt vời để hiểu và thử nghiệm với giao thức
units/vi/unit1/introduction.mdx ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Giới thiệu về Giao Thức Ngữ Cảnh Mô Hình (MCP)
2
+
3
+ Chào mừng các bạn đến với Chương 1 của Khóa học MCP! Trong chương này, chúng ta sẽ cùng khám phá những nguyên tắc cơ bản của Giao Thức Ngữ Cảnh Mô Hình.
4
+
5
+ ## Những gì bạn sẽ học
6
+
7
+ Trong chương này, các bạn sẽ:
8
+
9
+ * Hiểu MCP là gì và tại sao nó quan trọng
10
+ * Nắm được các khái niệm chính và thuật ngữ liên quan đến MCP
11
+ * Khám phá những thách thức tích hợp mà MCP giải quyết
12
+ * Tìm hiểu các lợi ích và mục tiêu chính của MCP
13
+ * Xem ví dụ đơn giản về tích hợp MCP trong thực tế
14
+
15
+ Khi kết thúc chương này, các bạn sẽ nắm vững những khái niệm nền tảng về MCP và sẵn sàng đi sâu vào kiến trúc và cách triển khai ở chương tiếp theo.
16
+
17
+ ## Tầm quan trọng của MCP
18
+
19
+ Hệ sinh thái AI đang phát triển nhanh chóng với các Mô hình Ngôn ngữ Lớn (LLMs) và hệ thống AI khác ngày càng mạnh mẽ. Tuy nhiên, các mô hình này thường bị giới hạn bởi dữ liệu huấn luyện và thiếu khả năng truy cập thông tin thời gian thực hay các công cụ chuyên biệt. Hạn chế này cản trở tiềm năng của hệ thống AI trong việc đưa ra phản hồi thực sự phù hợp, chính xác và hữu ích.
20
+
21
+ Đây chính là lúc Giao Thức Ngữ Cảnh Mô Hình (MCP) phát huy tác dụng. MCP cho phép các mô hình AI kết nối với nguồn dữ liệu bên ngoài, công cụ và môi trường, tạo điều kiện trao đổi thông tin liền mạch giữa hệ thống AI và thế giới số. Khả năng tương tác này rất quan trọng cho sự phát triển và ứng dụng rộng rãi của các ứng dụng AI thực sự hữu ích.
22
+
23
+ ## Tổng quan Chương 1
24
+
25
+ Dưới đây là những nội dung chính chúng ta sẽ đề cập:
26
+
27
+ 1. **MCP là gì?** - Bắt đầu với định nghĩa về MCP và vai trò của nó trong hệ sinh thái AI
28
+ 2. **Khái niệm chính** - Khám phá những khái niệm nền tảng và thuật ngữ liên quan
29
+ 3. **Thách thức tích hợp** - Phân tích các vấn đề MCP hướng tới giải quyết, đặc biệt là "Bài toán tích hợp M×N"
30
+ 4. **Lợi ích và mục tiêu** - Thảo luận về các ưu điểm và mục đích chính của MCP như chuẩn hóa, nâng cao khả năng AI và khả năng tương tác
31
+ 5. **Ví dụ đơn giản** - Cùng xem qua ví dụ thực tế về tích hợp MCP
32
+
33
+ Hãy cùng bắt đầu hành trình khám phá thế giới thú vị của Giao Thức Ngữ Cảnh Mô Hình!
units/vi/unit1/key-concepts.mdx ADDED
@@ -0,0 +1,88 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Các Khái Niệm và Thuật Ngữ Chính
2
+
3
+ Trước khi đi sâu vào Giao Thức Ngữ Cảnh Mô Hình (MCP), chúng ta cần hiểu các khái niệm và thuật ngữ then chốt tạo nền tảng cho MCP. Chương này sẽ giới thiệu những ý tưởng cốt lõi cùng bộ từ vựng chung để thảo luận về các triển khai MCP xuyên suốt khóa học.
4
+
5
+ MCP thường được ví như "USB-C cho các ứng dụng AI". Giống như USB-C cung cấp giao diện vật lý và logic chuẩn hóa để kết nối các thiết bị ngoại vi với máy tính, MCP đưa ra giao thức đồng nhất để liên kết các mô hình AI với khả năng mở rộng. Sự chuẩn hóa này mang lợi ích cho toàn bộ hệ sinh thái:
6
+
7
+ - **Người dùng** được trải nghiệm đơn giản và nhất quán hơn trên mọi ứng dụng AI
8
+ - **Nhà phát triển ứng dụng AI** dễ dàng tích hợp với hệ sinh thái công cụ và nguồn dữ liệu ngày càng phong phú
9
+ - **Nhà cung cấp công cụ/dữ liệu** chỉ cần xây dựng một triển khai duy nhất tương thích với nhiều ứng dụng AI
10
+ - **Toàn hệ sinh thái** hưởng lợi từ khả năng tương tác cao hơn, đổi mới mạnh mẽ hơn và giảm phân mảnh
11
+
12
+ ## Bài Toán Tích Hợp
13
+
14
+ **Bài Toán Tích Hợp M×N** ám chỉ thách thức khi kết nối M ứng dụng AI khác nhau với N công cụ/nguồn dữ liệu ngoài mà không có phương pháp chuẩn hóa.
15
+
16
+ ### Không có MCP (Bài Toán M×N)
17
+
18
+ Không có giao thức như MCP, nhà phát triển phải tạo M×N tích hợp tùy biến - mỗi tích hợp cho một cặp ứng dụng AI với khả năng mở rộng.
19
+
20
+ ![Without MCP](https://huggingface.co/datasets/mcp-course/images/resolve/main/unit1/1.png)
21
+
22
+ Mỗi ứng dụng AI cần tích hợp riêng lẻ với từng công cụ/nguồn dữ liệu. Quá trình này rất phức tạp, tốn kém và gây nhiều khó khăn cho nhà phát triển, đồng thời làm tăng chi phí bảo trì.
23
+
24
+ ### Với MCP (Giải Pháp M+N)
25
+
26
+ MCP biến bài toán này thành M+N bằng cách cung cấp giao diện chuẩn: mỗi ứng dụng AI triển khai phía Máy khách MCP một lần, mỗi công cụ/nguồn dữ liệu triển khai phía Máy chủ một lần. Cách này giảm đáng kể độ phức tạp tích hợp và gánh nặng bảo trì.
27
+
28
+ ![With MCP](https://huggingface.co/datasets/mcp-course/images/resolve/main/unit1/2.png)
29
+
30
+ Mỗi ứng dụng AI triển khai phía Máy khách MCP một lần, mỗi công cụ/nguồn dữ liệu triển khai phía Máy chủ một lần.
31
+
32
+ ## Thuật ngữ cốt lõi trong MCP
33
+
34
+ Giờ chúng ta đã hiểu vấn đề mà MCP giải quyết, hãy cùng khám phá các thuật ngữ và khái niệm cốt lõi tạo nên giao thức MCP.
35
+
36
+ <Tip>
37
+
38
+ MCP là một chuẩn như HTTP hay USB-C, và là giao thức để kết nối các ứng dụng AI với công cụ và nguồn dữ liệu bên ngoài. Vì vậy, việc sử dụng thuật ngữ chuẩn là cực kỳ quan trọng để MCP hoạt động hiệu quả.
39
+
40
+ Khi viết tài liệu ứng dụng và trao đổi với cộng đồng, chúng ta nên sử dụng các thuật ngữ sau đây.
41
+
42
+ </Tip>
43
+
44
+ ### Thành phần
45
+
46
+ Tương tự như mối quan hệ client-server trong HTTP, MCP có client (máy khách) và server (máy chủ).
47
+
48
+ ![MCP Components](https://huggingface.co/datasets/mcp-course/images/resolve/main/unit1/3.png)
49
+
50
+ - **Host**: Ứng dụng AI mà người dùng cuối tương tác trực tiếp. Ví dụ: Claude Desktop của Anthropic, các IDE tích hợp AI như Cursor, thư viện inference như Hugging Face Python SDK, hoặc ứng dụng tùy chỉnh xây dựng bằng thư viện như LangChain hay smolagents. Host khởi tạo kết nối đến Máy chủ MCP và điều phối luồng làm việc giữa yêu cầu người dùng, xử lý LLM và công cụ bên ngoài.
51
+
52
+ - **Client**: Thành phần trong ứng dụng Host quản lý giao tiếp với một MCP Server cụ thể. Mỗi Client duy trì kết nối 1:1 với một Server, xử lý các chi tiết giao thức của MCP và đóng vai trò trung gian giữa logic của Host và Server bên ngoài.
53
+
54
+ - **Server**: Chương trình hoặc dịch vụ bên ngoài cung cấp các khả năng (Tools, Resources, Prompts) thông qua giao thức MCP.
55
+
56
+ <Tip warning={true}>
57
+
58
+ Nhiều tài liệu sử dụng 'Client' và 'Host' thay thế cho nhau. Về mặt kỹ thuật, Host là ứng dụng hướng đến người dùng, còn Client là thành phần bên trong ứng dụng Host quản lý giao tiếp với MCP Server.
59
+
60
+ </Tip>
61
+
62
+ ### Khả năng
63
+
64
+ Tất nhiên, giá trị ứng dụng của bạn được quyết định bởi tổng các khả năng mà nó cung cấp. Các khả năng là phần quan trọng nhất trong ứng dụng. MCP có thể kết nối với mọi dịch vụ phần mềm, nhưng có một số khả năng phổ biến được dùng cho nhiều ứng dụng AI.
65
+
66
+ | Khả năng | Mô tả | Ví dụ |
67
+ | ------------ | ------------- | ------------- |
68
+ | **Tools** | Các hàm có thể thực thi mà mô hình AI có thể gọi để thực hiện hành động hoặc truy xuất dữ liệu đã tính toán. Thường liên quan đến use case của ứng dụng. | Một tool cho ứng dụng thời tiết có thể là hàm trả về thời tiết ở địa điểm cụ thể. |
69
+ | **Resources** | Nguồn dữ liệu chỉ đọc cung cấp ngữ cảnh mà không cần tính toán phức tạp. | Trợ lý nghiên cứu có thể có nguồn về các bài báo khoa học. |
70
+ | **Prompts** | Các mẫu hoặc quy trình làm việc được định nghĩa sẵn để hướng dẫn tương tác giữa người dùng, mô hình AI và các khả năng có sẵn. | Prompt tóm tắt văn bản. |
71
+ | **Sampling** | Các yêu cầu do Máy chủ khởi tạo để Client/Host thực hiện tương tác LLM, cho phép hành động đệ quy nơi LLM có thể xem xét nội dung đã tạo và đưa ra quyết định tiếp theo. | Ứng dụng viết lách tự đánh giá output và quyết định cải thiện thêm. |
72
+
73
+ Trong sơ đồ sau, chúng ta có thể thấy các khả năng được áp dụng cho use case của một CodeAgent.
74
+
75
+ ![collective diagram](https://huggingface.co/datasets/mcp-course/images/resolve/main/unit1/8.png)
76
+
77
+ Ứng dụng này có thể sử dụng các thực thể MCP theo cách sau:
78
+
79
+ | Thực thể | Tên | Mô tả |
80
+ | -------- | -------------- | ------------------------- |
81
+ | Tool | Code Interpreter | Công cụ có thể thực thi mã mà LLM viết. |
82
+ | Resource | Documentation | Tài nguyên chứa tài liệu hướng dẫn của ứng dụng. |
83
+ | Prompt | Code Style | Prompt hướng dẫn LLM tạo mã. |
84
+ | Sampling | Code Review | Sampling cho phép LLM review mã và đưa ra quyết định tiếp theo.|
85
+
86
+ ### Kết luận
87
+
88
+ Hiểu rõ những khái niệm và thuật ngữ chính này sẽ tạo nền tảng để làm việc hiệu quả với MCP (Giao Thức Ngữ Cảnh Mô Hình). Trong các phần tiếp theo, chúng ta sẽ xây dựng dựa trên nền tảng này để khám phá các thành phần kiến trúc, giao thức truyền thông và tính năng tạo nên Giao Thức Ngữ Cảnh Mô Hình.
units/vi/unit1/mcp-clients.mdx ADDED
@@ -0,0 +1,422 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # MCP Clients
2
+
3
+ Giờ khi đã hiểu cơ bản về Giao Thức Ngữ Cảnh Mô Hình (MCP), chúng ta có thể khám phá vai trò quan trọng của Client MCP trong hệ sinh thái MCP.
4
+
5
+ Trong phần này của Chương 1, chúng ta sẽ khám phá vai trò thiết yếu của Client MCP trong hệ sinh thái MCP.
6
+
7
+ Trong phần này, các bạn sẽ:
8
+
9
+ * Hiểu Client MCP là gì và vai trò của chúng trong kiến trúc MCP
10
+ * Tìm hiểu về các trách nhiệm chính của Client MCP
11
+ * Khám phá các triển khai Client MCP chính
12
+ * Khám phá cách sử dụng triển khai Client MCP của Hugging Face
13
+ * Xem các ví dụ thực tế về cách sử dụng Client MCP
14
+
15
+ ## Hiểu về Client MCP
16
+
17
+ Client MCP là thành phần quan trọng đóng vai trò cầu nối giữa các ứng dụng AI (Server) và các khả năng bên ngoài được cung cấp bởi Server MCP. Hãy hình dung Server như ứng dụng chính của bạn (ví dụ: trợ lý AI hoặc IDE) và Client như một mô-đun chuyên biệt trong Server đó chịu trách nhiệm xử lý các giao tiếp MCP.
18
+
19
+ ## Client giao diện người dùng
20
+
21
+ Hãy bắt đầu bằng cách khám phá các Client giao diện người dùng có sẵn cho MCP.
22
+
23
+ ### Client giao diện chat
24
+
25
+ Claude Desktop của Anthropic là một trong những Client MCP nổi bật nhất, cung cấp tích hợp với nhiều Server MCP khác nhau.
26
+
27
+ ### Client phát triển tương tác
28
+
29
+ Triển khai Client MCP của Cursor cho phép trợ lý lập trình hỗ trợ AI thông qua tích hợp trực tiếp với các tính năng chỉnh sửa code. Nó hỗ trợ nhiều kết nối Server MCP và cung cấp khả năng gọi công cụ thời gian thực khi lập trình, biến nó thành công cụ mạnh mẽ cho các nhà phát triển.
30
+
31
+ Continue.dev là một ví dụ khác về Client phát triển tương tác hỗ trợ MCP và kết nối với Server MCP từ VS Code.
32
+
33
+ ## Cấu hình Client MCP
34
+
35
+ Giờ khi đã nắm được phần cốt lõi của giao thức MCP, hãy xem cách cấu hình các Server và Client MCP của bạn.
36
+
37
+ Triển khai hiệu quả các Server và Client MCP yêu cầu cấu hình đúng cách.
38
+
39
+ <Tip>
40
+
41
+ Đặc tả MCP vẫn đang phát triển, vì vậy các phương pháp cấu hình có thể thay đổi. Chúng ta sẽ tập trung vào các phương pháp tốt nhất hiện tại để cấu hình.
42
+
43
+ </Tip>
44
+
45
+ ### Tệp cấu hình MCP
46
+
47
+ Các Server MCP sử dụng các tệp cấu hình để quản lý kết nối với Server. Những tệp này xác định các Server nào có sẵn và cách kết nối với chúng.
48
+
49
+ May mắn là các tệp cấu hình rất đơn giản, dễ hiểu và thống nhất giữa các Server MCP chính.
50
+
51
+ #### Cấu trúc `mcp.json`
52
+
53
+ Tệp cấu hình tiêu chuẩn cho MCP có tên `mcp.json`. Đây là cấu trúc cơ bản:
54
+
55
+ ```json
56
+ {
57
+ "servers": [
58
+ {
59
+ "name": "Server Name",
60
+ "transport": {
61
+ "type": "stdio|sse",
62
+ // Cấu hình cụ thể cho phương thức truyền tải
63
+ }
64
+ }
65
+ ]
66
+ }
67
+ ```
68
+
69
+ Trong ví dụ này, chúng ta có một Server duy nhất với tên và loại phương thức truyền tải. Loại phương thức truyền tải có thể là `stdio` hoặc `sse`.
70
+
71
+ #### Cấu hình cho phương thức truyền tải stdio
72
+
73
+ Đối với các Server cục bộ sử dụng phương thức truyền tải stdio, cấu hình bao gồm lệnh và các đối số để khởi chạy tiến trình Server:
74
+
75
+ ```json
76
+ {
77
+ "servers": [
78
+ {
79
+ "name": "File Explorer",
80
+ "transport": {
81
+ "type": "stdio",
82
+ "command": "python",
83
+ "args": ["/path/to/file_explorer_server.py"]
84
+ }
85
+ }
86
+ ]
87
+ }
88
+ ```
89
+
90
+ Ở đây, chúng ta có một Server có tên "File Explorer" là một tập lệnh cục bộ.
91
+
92
+ #### Cấu hình cho phương thức truyền tải HTTP+SSE
93
+
94
+ Đối với các Server từ xa sử dụng phương thức truyền tải HTTP+SSE, cấu hình bao gồm URL của Server:
95
+
96
+ ```json
97
+ {
98
+ "servers": [
99
+ {
100
+ "name": "Remote API Server",
101
+ "transport": {
102
+ "type": "sse",
103
+ "url": "https://example.com/mcp-server"
104
+ }
105
+ }
106
+ ]
107
+ }
108
+ ```
109
+
110
+ #### Biến môi trường trong cấu hình
111
+
112
+ Các biến môi trường có thể được truyền vào tiến trình Server bằng cách sử dụng trường `env`. Đây là cách truy cập chúng trong mã Server của bạn:
113
+
114
+ <hfoptions id="env-variables">
115
+ <hfoption id="python">
116
+
117
+ Trong Python, chúng ta sử dụng module `os` để truy cập các biến môi trường:
118
+
119
+ <details>
120
+ <summary>Bấm để xem bản dịch tiếng Việt</summary>
121
+ ```
122
+ import os
123
+
124
+ # Truy cập các biến môi trường
125
+ github_token = os.environ.get("GITHUB_TOKEN")
126
+ if not github_token:
127
+ raise ValueError("GITHUB_TOKEN environment variable is required")
128
+
129
+ # Sử dụng token trong mã Server
130
+ def make_github_request():
131
+ headers = {"Authorization": f"Bearer {github_token}"}
132
+ # ... phần còn lại của mã
133
+ ```
134
+ </details>
135
+ ```
136
+ import os
137
+
138
+ # Access environment variables
139
+ github_token = os.environ.get("GITHUB_TOKEN")
140
+ if not github_token:
141
+ raise ValueError("GITHUB_TOKEN environment variable is required")
142
+
143
+ # Use the token in your server code
144
+ def make_github_request():
145
+ headers = {"Authorization": f"Bearer {github_token}"}
146
+ # ... rest of your code
147
+ ```
148
+
149
+ </hfoption>
150
+ <hfoption id="javascript">
151
+
152
+ Trong JavaScript, chúng ta sử dụng object `process.env` để truy cập các biến môi trường:
153
+
154
+ <details>
155
+ <summary>Bấm để xem bản dịch tiếng Việt</summary>
156
+ ```
157
+ // Truy cập các biến môi trường
158
+ const githubToken = process.env.GITHUB_TOKEN;
159
+ if (!githubToken) {
160
+ throw new Error("GITHUB_TOKEN environment variable is required");
161
+ }
162
+
163
+ // Sử dụng token trong mã Server
164
+ function makeGithubRequest() {
165
+ const headers = { "Authorization": `Bearer ${githubToken}` };
166
+ // ... phần còn lại của mã
167
+ }
168
+ ```
169
+ </details>
170
+ ```
171
+ // Access environment variables
172
+ const githubToken = process.env.GITHUB_TOKEN;
173
+ if (!githubToken) {
174
+ throw new Error("GITHUB_TOKEN environment variable is required");
175
+ }
176
+
177
+ // Use the token in your server code
178
+ function makeGithubRequest() {
179
+ const headers = { "Authorization": `Bearer ${githubToken}` };
180
+ // ... rest of your code
181
+ }
182
+ ```
183
+
184
+ </hfoption>
185
+ </hfoptions>
186
+
187
+ Cấu hình tương ứng trong `mcp.json` sẽ trông như thế này:
188
+
189
+ ```json
190
+ {
191
+ "servers": [
192
+ {
193
+ "name": "GitHub API",
194
+ "transport": {
195
+ "type": "stdio",
196
+ "command": "python",
197
+ "args": ["/path/to/github_server.py"],
198
+ "env": {
199
+ "GITHUB_TOKEN": "your_github_token"
200
+ }
201
+ }
202
+ }
203
+ ]
204
+ }
205
+ ```
206
+
207
+ ### Ví dụ về Cấu hình
208
+
209
+ Hãy cùng xem qua một số kịch bản cấu hình trong thực tế:
210
+
211
+ #### Kịch bản 1: Cấu hình Server Cục bộ
212
+
213
+ Trong kịch bản này, chúng ta có một Server cục bộ là script Python có thể là trình khám phá file hoặc trình chỉnh sửa code.
214
+
215
+ ```json
216
+ {
217
+ "servers": [
218
+ {
219
+ "name": "File Explorer",
220
+ "transport": {
221
+ "type": "stdio",
222
+ "command": "python",
223
+ "args": ["/path/to/file_explorer_server.py"]
224
+ }
225
+ }
226
+ ]
227
+ }
228
+ ```
229
+
230
+ #### Kịch bản 2: Cấu hình Server Từ xa
231
+
232
+ Trong kịch bản này, chúng ta có một Server từ xa là API thời tiết.
233
+
234
+ ```json
235
+ {
236
+ "servers": [
237
+ {
238
+ "name": "Weather API",
239
+ "transport": {
240
+ "type": "sse",
241
+ "url": "https://example.com/mcp-server"
242
+ }
243
+ }
244
+ ]
245
+ }
246
+ ```
247
+
248
+ Việc cấu hình đúng cách là yếu tố thiết yếu để triển khai thành công các tích hợp MCP. Bằng cách hiểu rõ các khía cạnh này, các bạn có thể tạo ra các kết nối mạnh mẽ và đáng tin cậy giữa các ứng dụng AI và các khả năng bên ngoài.
249
+
250
+ Trong phần tiếp theo, chúng ta sẽ khám phá hệ sinh thái các Server MCP có sẵn trên Hugging Face Hub và cách xuất bản Server của riêng bạn tại đó.
251
+
252
+ ## Code Clients
253
+
254
+ Bạn cũng có thể sử dụng MCP Client trong code để các công cụ có sẵn cho LLM. Hãy cùng khám phá một số ví dụ trong `smolagents`.
255
+
256
+ Đầu tiên, hãy xem qua Server thời tiết từ trang trước. Trong `smolagents`, chúng ta có thể sử dụng lớp `ToolCollection` để tự động phát hiện và đăng ký các công cụ từ Server MCP. Việc này được thực hiện bằng cách truyền `StdioServerParameters` hoặc `SSEServerParameters` vào phương thức `ToolCollection.from_mcp`. Sau đó chúng ta có thể in các công cụ ra console.
257
+
258
+ <details>
259
+ <summary>Bấm để xem bản dịch tiếng Việt</summary>
260
+ ```python
261
+ from smolagents import ToolCollection, CodeAgent
262
+ from mcp.client.stdio import StdioServerParameters
263
+
264
+ server_parameters = StdioServerParameters(command="uv", args=["run", "server.py"])
265
+
266
+ with ToolCollection.from_mcp(
267
+ server_parameters, trust_remote_code=True
268
+ ) as tools:
269
+ print("\n".join(f"{t.name}: {t.description}" for t in tools))
270
+ ```
271
+ </details>
272
+ ```python
273
+ from smolagents import ToolCollection, CodeAgent
274
+ from mcp.client.stdio import StdioServerParameters
275
+
276
+ server_parameters = StdioServerParameters(command="uv", args=["run", "server.py"])
277
+
278
+ with ToolCollection.from_mcp(
279
+ server_parameters, trust_remote_code=True
280
+ ) as tools:
281
+ print("\n".join(f"{t.name}: {t.description}" for t in tools))
282
+
283
+ ```
284
+
285
+ <details>
286
+ <summary>
287
+ Kết quả
288
+ </summary>
289
+
290
+ ```sh
291
+ Weather API: Get the weather in a specific location
292
+
293
+ ```
294
+
295
+ </details>
296
+
297
+ Chúng ta cũng có thể kết nối đến Server MCP được host trên máy từ xa. Trong trường hợp này, chúng ta cần truyền `SSEServerParameters` vào phương thức `ToolCollection.from_mcp`.
298
+
299
+ <details>
300
+ <summary>Bấm để xem bản dịch tiếng Việt</summary>
301
+ ```python
302
+ from smolagents.mcp_client import MCPClient
303
+
304
+ with MCPClient(
305
+ {"url": "https://abidlabs-mcp-tools.hf.space/gradio_api/mcp/sse"}
306
+ ) as tools:
307
+ # Tools from the remote server are available
308
+ print("\n".join(f"{t.name}: {t.description}" for t in tools))
309
+ ```
310
+ </details>
311
+ ```python
312
+ from smolagents.mcp_client import MCPClient
313
+
314
+ with MCPClient(
315
+ {"url": "https://abidlabs-mcp-tools.hf.space/gradio_api/mcp/sse"}
316
+ ) as tools:
317
+ # Tools from the remote server are available
318
+ print("\n".join(f"{t.name}: {t.description}" for t in tools))
319
+ ```
320
+
321
+ <details>
322
+ <summary>
323
+ Kết quả
324
+ </summary>
325
+
326
+ ```sh
327
+ prime_factors: Compute the prime factorization of a positive integer.
328
+ generate_cheetah_image: Generate a cheetah image.
329
+ image_orientation: Returns whether image is portrait or landscape.
330
+ sepia: Apply a sepia filter to the input image.
331
+ ```
332
+
333
+ </details>
334
+
335
+ Bây giờ hãy xem cách sử dụng MCP Client trong một code agent.
336
+
337
+ <details>
338
+ <summary>Bấm để xem bản dịch tiếng Việt</summary>
339
+ ```python
340
+ from smolagents import ToolCollection, CodeAgent
341
+ from mcp.client.stdio import StdioServerParameters
342
+ from smolagents import CodeAgent, InferenceClientModel
343
+
344
+ model = InferenceClientModel()
345
+
346
+ server_parameters = StdioServerParameters(command="uv", args=["run", "server.py"])
347
+
348
+ with ToolCollection.from_mcp(
349
+ server_parameters, trust_remote_code=True
350
+ ) as tool_collection:
351
+ agent = CodeAgent(tools=[*tool_collection.tools], model=model)
352
+ agent.run("What's the weather in Tokyo?")
353
+ ```
354
+ </details>
355
+ ```python
356
+ from smolagents import ToolCollection, CodeAgent
357
+ from mcp.client.stdio import StdioServerParameters
358
+ from smolagents import CodeAgent, InferenceClientModel
359
+
360
+ model = InferenceClientModel()
361
+
362
+ server_parameters = StdioServerParameters(command="uv", args=["run", "server.py"])
363
+
364
+ with ToolCollection.from_mcp(
365
+ server_parameters, trust_remote_code=True
366
+ ) as tool_collection:
367
+ agent = CodeAgent(tools=[*tool_collection.tools], model=model)
368
+ agent.run("What's the weather in Tokyo?")
369
+
370
+ ```
371
+
372
+ <details>
373
+ <summary>
374
+ Kết quả
375
+ </summary>
376
+
377
+ ```sh
378
+ The weather in Tokyo is sunny with a temperature of 20 degrees Celsius.
379
+ ```
380
+
381
+ </details>
382
+
383
+ Chúng ta cũng có thể kết nối đến các gói MCP. Đây là ví dụ về cách kết nối đến gói `pubmedmcp`.
384
+
385
+ ```python
386
+ from smolagents import ToolCollection, CodeAgent
387
+ from mcp import StdioServerParameters
388
+
389
+ server_parameters = StdioServerParameters(
390
+ command="uv",
391
+ args=["--quiet", "pubmedmcp@0.1.3"],
392
+ env={"UV_PYTHON": "3.12", **os.environ},
393
+ )
394
+
395
+ with ToolCollection.from_mcp(server_parameters, trust_remote_code=True) as tool_collection:
396
+ agent = CodeAgent(tools=[*tool_collection.tools], add_base_tools=True)
397
+ agent.run("Please find a remedy for hangover.")
398
+ ```
399
+
400
+ <details>
401
+ <summary>Kết quả</summary>
402
+
403
+ <details>
404
+ <summary>Bấm để xem bản dịch tiếng Việt</summary>
405
+ ```sh
406
+ Phương pháp chữa nôn nao là uống nước.
407
+ ```
408
+ </details>
409
+ ```sh
410
+ The remedy for hangover is to drink water.
411
+ ```
412
+
413
+ </details>
414
+
415
+ ## Bước tiếp theo
416
+
417
+ Giờ bạn đã hiểu về MCP Client, hãy sẵn sàng để:
418
+ * Khám phá các triển khai MCP Server cụ thể
419
+ * Tìm hiểu về cách tạo MCP Client tùy chỉnh
420
+ * Đi sâu vào các mẫu tích hợp MCP nâng cao
421
+
422
+ Hãy tiếp tục hành trình của chúng ta vào thế giới của Giao Thức Ngữ Cảnh Mô Hình!
units/vi/unit1/sdk.mdx ADDED
@@ -0,0 +1,279 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # MCP SDK
2
+
3
+ Giao Thức Ngữ Cảnh Mô Hình (MCP) cung cấp SDK chính thức cho cả JavaScript, Python và các ngôn ngữ khác. Điều này giúp việc triển khai Client và Server MCP trong ứng dụng của bạn trở nên dễ dàng. Các SDK này xử lý các chi tiết giao thức cấp thấp, cho phép bạn tập trung vào việc xây dựng chức năng ứng dụng.
4
+
5
+ ## Tổng quan về SDK
6
+
7
+ Cả hai SDK đều cung cấp chức năng cốt lõi tương tự, tuân theo đặc tả giao thức MCP mà chúng ta đã thảo luận trước đó. Chúng xử lý:
8
+
9
+ - Giao tiếp ở cấp độ giao thức
10
+ - Đăng ký và khám phá tính năng
11
+ - Tuần tự hóa/giải tuần tự hóa tin nhắn
12
+ - Quản lý kết nối
13
+ - Xử lý lỗi
14
+
15
+ ## Triển khai các thành phần cốt lõi
16
+
17
+ Hãy cùng khám phá cách triển khai từng thành phần cốt lõi (Tools, Resources, và Prompts) bằng cả hai SDK.
18
+
19
+ <hfoptions id="server-implementation">
20
+ <hfoption id="python">
21
+
22
+ <Youtube id="exzrb5QNUis" />
23
+
24
+ <details>
25
+ <summary>Bấm để xem bản dịch tiếng Việt</summary>
26
+ ```python
27
+ from mcp.server.fastmcp import FastMCP
28
+
29
+ # Tạo Server MCP
30
+ mcp = FastMCP("Dịch vụ Thời tiết")
31
+
32
+
33
+ @mcp.tool()
34
+ def get_weather(location: str) -> str:
35
+ """Nhận thông tin thời tiết hiện tại ở một địa điểm cụ thể."""
36
+ return f"Weather in {location}: Sunny, 72°F"
37
+
38
+
39
+ @mcp.resource("weather://{location}")
40
+ def weather_resource(location: str) -> str:
41
+ """Cung cấp dữ liệu thời tiết dưới dạng tài nguyên."""
42
+ return f"Weather data for {location}: Sunny, 72°F"
43
+
44
+
45
+ @mcp.prompt()
46
+ def weather_report(location: str) -> str:
47
+ """Tạo lời nhắc báo cáo thời tiết."""
48
+ return f"""You are a weather reporter. Weather report for {location}?"""
49
+
50
+
51
+ # Chạy Server
52
+ if __name__ == "__main__":
53
+ mcp.run()
54
+ ```
55
+ </details>
56
+
57
+ ```python
58
+ from mcp.server.fastmcp import FastMCP
59
+
60
+ # Create an MCP server
61
+ mcp = FastMCP("Weather Service")
62
+
63
+
64
+ @mcp.tool()
65
+ def get_weather(location: str) -> str:
66
+ """Get the current weather for a specified location."""
67
+ return f"Weather in {location}: Sunny, 72°F"
68
+
69
+
70
+ @mcp.resource("weather://{location}")
71
+ def weather_resource(location: str) -> str:
72
+ """Provide weather data as a resource."""
73
+ return f"Weather data for {location}: Sunny, 72°F"
74
+
75
+
76
+ @mcp.prompt()
77
+ def weather_report(location: str) -> str:
78
+ """Create a weather report prompt."""
79
+ return f"""You are a weather reporter. Weather report for {location}?"""
80
+
81
+
82
+ # Run the server
83
+ if __name__ == "__main__":
84
+ mcp.run()
85
+
86
+ ```
87
+
88
+ </hfoption>
89
+ <hfoption id="javascript">
90
+
91
+ <details>
92
+ <summary>Bấm để xem bản dịch tiếng Việt</summary>
93
+ ```javascript
94
+ import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
95
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
96
+ import { z } from "zod";
97
+
98
+ // Tạo Server MCP
99
+ const server = new McpServer({
100
+ name: "Dịch vụ Thời tiết",
101
+ version: "1.0.0"
102
+ });
103
+
104
+ // Triển khai công cụ
105
+ server.tool("get_weather",
106
+ { location: z.string() },
107
+ async ({ location }) => ({
108
+ content: [{
109
+ type: "text",
110
+ text: `Weather in ${location}: Sunny, 72°F`
111
+ }]
112
+ })
113
+ );
114
+
115
+ // Triển khai tài nguyên
116
+ server.resource(
117
+ "weather",
118
+ new ResourceTemplate("weather://{location}", { list: undefined }),
119
+ async (uri, { location }) => ({
120
+ contents: [{
121
+ uri: uri.href,
122
+ text: `Weather data for ${location}: Sunny, 72°F`
123
+ }]
124
+ })
125
+ );
126
+
127
+ // Triển khai prompt
128
+ server.prompt(
129
+ "weather_report",
130
+ { location: z.string() },
131
+ async ({ location }) => ({
132
+ messages: [
133
+ {
134
+ role: "assistant",
135
+ content: {
136
+ type: "text",
137
+ text: "You are a weather reporter."
138
+ }
139
+ },
140
+ {
141
+ role: "user",
142
+ content: {
143
+ type: "text",
144
+ text: `Weather report for ${location}?`
145
+ }
146
+ }
147
+ ]
148
+ })
149
+ );
150
+
151
+ // Chạy server
152
+ const transport = new StdioServerTransport();
153
+ await server.connect(transport);
154
+ ```
155
+ </details>
156
+
157
+ ```javascript
158
+ import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
159
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
160
+ import { z } from "zod";
161
+
162
+ // Create an MCP server
163
+ const server = new McpServer({
164
+ name: "Weather Service",
165
+ version: "1.0.0"
166
+ });
167
+
168
+ // Tool implementation
169
+ server.tool("get_weather",
170
+ { location: z.string() },
171
+ async ({ location }) => ({
172
+ content: [{
173
+ type: "text",
174
+ text: `Weather in ${location}: Sunny, 72°F`
175
+ }]
176
+ })
177
+ );
178
+
179
+ // Resource implementation
180
+ server.resource(
181
+ "weather",
182
+ new ResourceTemplate("weather://{location}", { list: undefined }),
183
+ async (uri, { location }) => ({
184
+ contents: [{
185
+ uri: uri.href,
186
+ text: `Weather data for ${location}: Sunny, 72°F`
187
+ }]
188
+ })
189
+ );
190
+
191
+ // Prompt implementation
192
+ server.prompt(
193
+ "weather_report",
194
+ { location: z.string() },
195
+ async ({ location }) => ({
196
+ messages: [
197
+ {
198
+ role: "assistant",
199
+ content: {
200
+ type: "text",
201
+ text: "You are a weather reporter."
202
+ }
203
+ },
204
+ {
205
+ role: "user",
206
+ content: {
207
+ type: "text",
208
+ text: `Weather report for ${location}?`
209
+ }
210
+ }
211
+ ]
212
+ })
213
+ );
214
+
215
+ // Run the server
216
+ const transport = new StdioServerTransport();
217
+ await server.connect(transport);
218
+ ```
219
+
220
+ </hfoption>
221
+ </hfoptions>
222
+
223
+ Sau khi đã triển khai máy chủ của mình, bạn có thể khởi chạy nó bằng cách chạy script server.
224
+
225
+ ```bash
226
+ mcp dev server.py
227
+ ```
228
+
229
+ Lệnh này sẽ khởi tạo một máy chủ phát triển chạy file `server.py` và ghi lại output sau:
230
+
231
+ <details>
232
+ <summary>Bấm để xem bản dịch tiếng Việt</summary>
233
+ ```
234
+ Starting MCP inspector...
235
+ ⚙️ Proxy server listening on port 6277
236
+ Spawned stdio transport
237
+ Connected MCP client to backing server transport
238
+ Created web app transport
239
+ Set up MCP proxy
240
+ 🔍 MCP Inspector is up and running at http://127.0.0.1:6274 🚀
241
+ ```
242
+ </details>
243
+ ```bash
244
+ Starting MCP inspector...
245
+ ⚙️ Proxy server listening on port 6277
246
+ Spawned stdio transport
247
+ Connected MCP client to backing server transport
248
+ Created web app transport
249
+ Set up MCP proxy
250
+ 🔍 MCP Inspector is up and running at http://127.0.0.1:6274 🚀
251
+ ```
252
+
253
+ Bạn có thể mở MCP Inspector tại [http://127.0.0.1:6274](http://127.0.0.1:6274) để xem các tính năng của máy chủ và tương tác với chúng.
254
+
255
+ Bạn sẽ thấy các tính năng của máy chủ và khả năng gọi chúng thông qua giao diện người dùng.
256
+
257
+ ![MCP Inspector](https://huggingface.co/datasets/mcp-course/images/resolve/main/unit1/6.png)
258
+
259
+ ## Bộ SDK MCP
260
+
261
+ MCP được thiết kế để độc lập với ngôn ngữ lập trình, và hiện có các SDK chính thức cho nhiều ngôn ngữ phổ biến:
262
+
263
+ | Ngôn ngữ | Kho lưu trữ | Người bảo trì | Trạng thái |
264
+ |----------|------------|---------------|--------|
265
+ | TypeScript | [github.com/modelcontextprotocol/typescript-sdk](https://github.com/modelcontextprotocol/typescript-sdk) | Anthropic | Hoạt động |
266
+ | Python | [github.com/modelcontextprotocol/python-sdk](https://github.com/modelcontextprotocol/python-sdk) | Anthropic | Hoạt động |
267
+ | Java | [github.com/modelcontextprotocol/java-sdk](https://github.com/modelcontextprotocol/java-sdk) | Spring AI (VMware) | Hoạt động |
268
+ | Kotlin | [github.com/modelcontextprotocol/kotlin-sdk](https://github.com/modelcontextprotocol/kotlin-sdk) | JetBrains | Hoạt động |
269
+ | C# | [github.com/modelcontextprotocol/csharp-sdk](https://github.com/modelcontextprotocol/csharp-sdk) | Microsoft | Hoạt động (Xem trước) |
270
+ | Swift | [github.com/modelcontextprotocol/swift-sdk](https://github.com/modelcontextprotocol/swift-sdk) | loopwork-ai | Hoạt động |
271
+ | Rust | [github.com/modelcontextprotocol/rust-sdk](https://github.com/modelcontextprotocol/rust-sdk) | Anthropic/Cộng đồng | Hoạt động |
272
+
273
+ Các SDK này cung cấp các abstraction đặc thù cho từng ngôn ngữ, giúp đơn giản hóa việc làm việc với giao thức MCP, cho phép bạn tập trung vào việc triển khai logic cốt lõi của máy chủ hoặc máy khách thay vì xử lý các chi tiết giao thức cấp thấp.
274
+
275
+ ## Bước tiếp theo
276
+
277
+ Chúng ta mới chỉ chạm vào bề mặt của những gì có thể làm với MCP nhưng bạn đã có một máy chủ cơ bản đang chạy. Thực tế, bạn cũng đã kết nối với nó bằng MCP Client trên trình duyệt.
278
+
279
+ Trong phần tiếp theo, chúng ta sẽ xem cách kết nối với máy chủ từ một LLM.