MCP server cung cấp cho client nhiều khả năng (capability) khác nhau thông qua giao thức truyền thông. Các capability này chia thành bốn nhóm chính, mỗi nhóm có đặc điểm và trường hợp sử dụng riêng. Hãy cùng tìm hiểu những thành phần cơ bản (primitive) tạo nên nền tảng chức năng của MCP.
Tools
Tools là các hàm hoặc hành động có thể thực thi mà model AI gọi được thông qua giao thức MCP.
- Điều khiển: Tool thường do model điều khiển, nghĩa là model AI (LLM) quyết định khi nào gọi tool dựa trên yêu cầu và ngữ cảnh của người dùng.
- An toàn: Vì tool có thể thực hiện hành động có tác dụng phụ (side effect), việc thực thi tool có thể nguy hiểm. Do đó tool thường cần người dùng phê duyệt rõ ràng.
- Trường hợp dùng: Gửi tin nhắn, tạo ticket, truy vấn API, thực hiện tính toán.
Ví dụ: Một tool thời tiết lấy dữ liệu thời tiết hiện tại cho một địa điểm:
def get_weather(location: str) -> dict:
"""Get the current weather for a specified location."""
# Connect to weather API and fetch data
return {
"temperature": 72,
"conditions": "Sunny",
"humidity": 45
}
function getWeather(location) {
// Connect to weather API and fetch data
return {
temperature: 72,
conditions: 'Sunny',
humidity: 45
};
}
Resources
Resource cung cấp quyền truy cập chỉ đọc tới các nguồn dữ liệu, cho phép model AI lấy ngữ cảnh mà không phải chạy logic phức tạp.
- Điều khiển: Resource do ứng dụng điều khiển, nghĩa là ứng dụng host thường quyết định khi nào truy cập chúng.
- Bản chất: Resource được thiết kế để lấy dữ liệu với rất ít tính toán, tương tự các endpoint GET trong REST API.
- An toàn: Vì chỉ đọc, resource thường ít rủi ro bảo mật hơn tool.
- Trường hợp dùng: Đọc nội dung file, lấy bản ghi trong cơ sở dữ liệu, đọc thông tin cấu hình.
Ví dụ: Một resource cho phép đọc nội dung file:
def read_file(file_path: str) -> str:
"""Read the contents of a file at the specified path."""
with open(file_path, 'r') as f:
return f.read()
function readFile(filePath) {
// Using fs.readFile to read file contents
const fs = require('fs');
return new Promise((resolve, reject) => {
fs.readFile(filePath, 'utf8', (err, data) => {
if (err) {
reject(err);
return;
}
resolve(data);
});
});
}
Prompts
Prompt là các mẫu (template) hoặc quy trình (workflow) định sẵn, dẫn dắt tương tác giữa người dùng, model AI và các capability của server.
- Điều khiển: Prompt do người dùng điều khiển, thường hiển thị như các lựa chọn trong giao diện của ứng dụng host.
- Mục đích: Prompt tổ chức tương tác để tận dụng tốt nhất các tool và resource sẵn có.
- Lựa chọn: Người dùng thường chọn prompt trước khi model AI bắt đầu xử lý, qua đó thiết lập ngữ cảnh cho tương tác.
- Trường hợp dùng: Các quy trình phổ biến, mẫu cho tác vụ chuyên biệt, tương tác có hướng dẫn.
Ví dụ: Một mẫu prompt để tạo bài review code:
def code_review(code: str, language: str) -> list:
"""Generate a code review for the provided code snippet."""
return [
{
"role": "system",
"content": f"You are a code reviewer examining {language} code. Provide a detailed review highlighting best practices, potential issues, and suggestions for improvement."
},
{
"role": "user",
"content": f"Please review this {language} code:\n\n```{language}\n{code}\n```"
}
]
function codeReview(code, language) {
return [
{
role: 'system',
content: `You are a code reviewer examining ${language} code. Provide a detailed review highlighting best practices, potential issues, and suggestions for improvement.`
},
{
role: 'user',
content: `Please review this ${language} code:\n\n\`\`\`${language}\n${code}\n\`\`\``
}
];
}
Sampling
Sampling 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 với LLM.
- Điều khiển: Sampling do server khởi xướng nhưng cần client/host hỗ trợ thực hiện.
- Mục đích: Cho phép các hành vi kiểu agent do server dẫn dắt, có thể là tương tác đệ quy hoặc nhiều bước.
- An toàn: Giống tool, thao tác sampling thường cần người dùng phê duyệt.
- Trường hợp dùng: Tác vụ phức tạp nhiều bước, quy trình agent tự động, quy trình tương tác.
Ví dụ: Server có thể yêu cầu client phân tích dữ liệu mà server đã xử lý:
def request_sampling(messages, system_prompt=None, include_context="none"):
"""Request LLM sampling from the client."""
# In a real implementation, this would send a request to the client
return {
"role": "assistant",
"content": "Analysis of the provided data..."
}
function requestSampling(messages, systemPrompt = null, includeContext = 'none') {
// In a real implementation, this would send a request to the client
return {
role: 'assistant',
content: 'Analysis of the provided data...'
};
}
function handleSamplingRequest(request) {
const { messages, systemPrompt, includeContext } = request;
// In a real implementation, this would process the request and return a response
return {
role: 'assistant',
content: 'Response to the sampling request...'
};
}
Luồng sampling gồm các bước:
- Server gửi request
sampling/createMessagetới client - Client xem xét request và có thể chỉnh sửa nó
- Client lấy kết quả (sample) từ một LLM
- Client xem xét kết quả sinh ra
- Client trả kết quả về cho server
Các capability phối hợp với nhau như thế nào
Hãy xem các capability này phối hợp ra sao để tạo nên những tương tác phức tạp. Bảng dưới đây tóm tắt từng capability, ai điều khiển, chiều điều khiển và một số chi tiết khác.
| Capability | Ai điều khiển | Chiều | Tác dụng phụ | Cần phê duyệt | Trường hợp dùng điển hình |
|---|---|---|---|---|---|
| Tools | Model (LLM) | Client → Server | Có (có thể) | Có | Hành động, gọi API, xử lý dữ liệu |
| Resources | Ứng dụng | Client → Server | Không (chỉ đọc) | Thường không | Lấy dữ liệu, thu thập ngữ cảnh |
| Prompts | Người dùng | Server → Client | Không | Không (người dùng tự chọn) | Quy trình có hướng dẫn, mẫu chuyên biệt |
| Sampling | Server | Server → Client → Server | Gián tiếp | Có | Tác vụ nhiều bước, hành vi kiểu agent |
Các capability này được thiết kế để bổ trợ cho nhau:
- Người dùng có thể chọn một Prompt để bắt đầu một quy trình chuyên biệt
- Prompt đó có thể kèm ngữ cảnh lấy từ Resources
- Trong lúc xử lý, model AI có thể gọi Tools để thực hiện hành động cụ thể
- Với thao tác phức tạp, server có thể dùng Sampling để yêu cầu LLM xử lý thêm
Sự phân biệt rõ giữa các primitive này tạo ra cấu trúc mạch lạc cho tương tác MCP: model AI có thể truy cập thông tin, thực hiện hành động và tham gia các quy trình phức tạp mà vẫn giữ ranh giới kiểm soát phù hợp.
Quá trình khám phá
Một tính năng then chốt của MCP là khám phá capability một cách động. Khi client kết nối tới server, nó có thể hỏi các tool, resource và prompt hiện có thông qua các phương thức liệt kê:
tools/list: Khám phá các tool hiện córesources/list: Khám phá các resource hiện cóprompts/list: Khám phá các prompt hiện có
Cơ chế khám phá động này cho phép client thích ứng với các capability cụ thể của từng server mà không cần biết trước (hardcode) chức năng của server.
Kết luận
Hiểu các primitive 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 capability riêng biệt với ranh giới kiểm soát rõ ràng, MCP cho phép model AI tương tác mạnh mẽ với các hệ thống bên ngoài mà vẫn duy trì cơ chế an toàn và kiểm soát phù hợp.
Ở phần tiếp theo, chúng ta sẽ tìm hiểu cách Gradio tích hợp với MCP để tạo giao diện dễ dùng cho các capability này (xem bài Tích hợp Gradio với MCP).
Nguồn
- Dịch và biên tập từ huggingface/mcp-course · units/en/unit1/capabilities.mdx, giấy phép Apache-2.0.